Mac下安装Python 3

Mac系统会自带Python 2.7.x。安装Python 3时,不要卸载Python 2.7.x,因为有Mac系统有一些库会依赖于Python 2.7.x。

安装步骤:

1 去Python官网www.python.org 下载最新版的Python 3.x for Mac。

注意,要下载稳定版,目前应该是3.6.4。不要下载alpha版本(内测版)和beta版本(公测版)

 
1.png

2 安装

3 在终端输入python -V检查python2的版本。输入python3 -V检查python3的版本。若正确显示版本号,说明安装成功。

 
2.png

4 用which python和which python3分别查看python2和python3的安装路径

 
3.png

5 至此,既可以使用python2,也可以使用python3。使用方法为:

python test.py
python3 test.py

若碰到包含中文的python程序,可以使用python3来运行。因为编码问题,python2对中文的支持不够方便。

实现简单计算器

代码

# 定义函数
def add(x, y):
"""相加""" return x + y def subtract(x, y):
"""相减""" return x - y def multiply(x, y):
"""相乘""" return x * y def divide(x, y):
"""相除""" return x / y # 用户输入
print("选择运算:")
print("1、相加")
print("2、相减")
print("3、相乘")
print("4、相除") choice = input("输入你的选择(1/2/3/4):") num1 = int(input("输入第一个数字: "))
num2 = int(input("输入第二个数字: ")) if choice == '1':
print(num1,"+",num2,"=", add(num1,num2)) elif choice == '2':
print(num1,"-",num2,"=", subtract(num1,num2)) elif choice == '3':
print(num1,"*",num2,"=", multiply(num1,num2)) elif choice == '4':
print(num1,"/",num2,"=", divide(num1,num2))
else:
print("非法输入")

运行结果:

选择运算:
1、相加
2、相减
3、相乘
4、相除
输入你的选择(1/2/3/4):3
输入第一个数字: 2
输入第二个数字: 5
2 * 5 = 10

全局变量的引用和修改

一、引用

例1

a = 1

def func():
if 1 == a:
print("a = %d" % a) if __name__ == '__main__':
func()

运行结果:

a = 1

二、修改

例2

a = 1

def func():
a = 2
print ("in func a:", a) if __name__ == '__main__':
print("before func a:", a)
func()
print("after func a:", a)

运行结果:

before func a: 1
in func a: 2
after func a: 1

说明:
从程序运行结果可以看出,全局变量a的值,并没有成功被修改为2.
这是因为,func()中的a,是一个局部变量,是在新的内存区域生成的一个新对象,只是名字也叫a罢了。

例3

a = 1

def func():
global a
a = 2
print ("in func a:", a) if __name__ == '__main__':
print("before func a:", a)
func()
print("after func a:", a)

运行结果:

before func a: 1
in func a: 2
after func a: 2

说明:加了global之后,func中的a就是第一行定义的全局变量a,所以可成功修改值

三、结论

若只是引用全局变量,不需要加global关键字;
若要修改全局变量,需要加global关键字。

join方法和eval方法

一、join方法

语法:
str.join(sequence)

功能:
join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串

参数:
sequence -- 要连接的元素序列

返回值:
返回通过指定字符连接序列中元素后生成的新字符串

例1

str = "-";
seq = ("a", "b", "c"); # 字符串元组
newstr = str.join(seq)
print(newstr)

运行结果:

a-b-c

例2

mylist = ['1', '+', '2', '-', 'c']
res = ''.join(mylist)
print(res)

运行结果:

1+2-c

二、eval方法

语法:
eval(expression, globals=None, locals=None)

功能:
将字符串str当成有效的表达式来求值并返回计算结果。

参数:
expression,要计算的表达式
globals,可选,如果提供了globals参数,那么它必须是dictionary类型
locals,可选,如果提供了locals参数,那么它可以是任意的map对象

返回值:
计算的结果

例3

x = 1
y = 2
z = eval('x + y')
print(z)

运行结果:

3

例4

mylist = ['1', '+', '2', '*', '3']
str = ''.join(mylist)
res = eval(str)
print(res)

运行结果:

7

实现带UI的简易计算器(上)

一、需求

实现一个简易计算器,用户界面类似小米手机的计算器。

 
calculator.png

二、编程环境

语言:Python 3
操作系统:Win/Mac

三、实现过程

(一)界面构成

首先,咱们看一下上面整个页面的构成:
有两个Label,上面那个height较大的Label用来显示计算过程,下面那个height较小的Label用来显示计算结果。
再下面是19个Button,排列成五行四列(等号占了两行)。

(二)数值定义

界面的宽度和高度通常用像素来表示,像素英文为pixel,简写为px。
按纽的宽和高设为70px * 60px,则整个界面的宽度为70px * 4 = 280px。
显示计算过程的Label高设为120px,显示计算结果的Label高设为60px,则整个界面的高度为120 + 60 + 60 * 5 = 480px。

这些数值以及字体、字号、按钮颜色、按纽边框粗细,都可以定义为全局变量:

w = 280                 #整个界面的宽度
h = 480 #整个界面的高度
processH = 120 #存放计算过程的Label的高度
resultH = 60 #存放计算结果的Label的高度
btnWidth = 70 #按纽宽度
btnHeight = 60 #按纽高度
msfont = '微软雅黑' #微软雅黑字体
fontSize = 20 #字体大小
btnFgColor = '#4F4F4F' #按纽颜色
btnBorderWidth = 0.5 #按纽边框粗细

(三)编写整个界面和两个Label

import tkinter #导入tkinter模块

#定义数值
w = 280 #整个界面的宽度
h = 480 #整个界面的高度
processH = 120 #存放计算过程的Label的高度
resultH = 60 #存放计算结果的Label的高度
btnWidth = 70 #按纽宽度
btnHeight = 60 #按纽高度
msfont = '微软雅黑' #微软雅黑字体
fontSize = 20 #字体大小
btnFgColor = '#4F4F4F' #按纽颜色
btnBorderWidth = 0.5 #按纽边框粗细 #面板设置
root = tkinter.Tk()
root.minsize(w,h) #面板大小的最小值
root.title('海天一树的计算器') #面板的标题 process = tkinter.StringVar() #字符串用于存放计算过程,初始状态为空
process.set('')
result = tkinter.StringVar() #字符串用于存放计算结果,初始状态为0
result.set(0) #labelProcess用于显示计算过程,labelResult用于显示计算结果
labelProcess = tkinter.Label(root,font = (msfont,fontSize),bg = '#ff0000',bd ='9',fg = '#828282',anchor = 'se',textvariable = process)
labelProcess.place(width = w,height = processH)
labelResult = tkinter.Label(root,font = (msfont,30),bg = '#00ff00',bd ='9',fg = 'black',anchor = 'se',textvariable = result)
labelResult.place(y = processH,width = w,height = resultH)

运行结果:

 
1.png

说明:
(1)tkinter.Label的数据结构为:

属性名称 属性含义
anchor 指示文字会被放在控件的什么位置, 可选项有 N, NE, E, SE, S, SW, W, NW, CENTER. 默认为 CENTER.
aspect 控件的宽高比, 即 width/height , 以百分比形式表示. 默认为 150, 即 Message 控件宽度比其高度大 50%. 注意: 如果显式的指定了控件宽度, 则该属性将被忽略.
background 控件的背景色. 默认值为当前窗口系统的默认背景色.
bg 同 background.
borderwidth 边框宽度. 默认为2.
bd 同 borderwidth.
cursor 定义鼠标移动到 Message 上时的光标样式. 默认为系统标准样式.
font 文字字体. 默认为当前系统默认.
foreground 文字颜色. 默认为当前系统默认.
fg 同 foreground
highlightbackground 和 highlightcolor, highlightthickness 这两个属性一起指定了控件如何绘制高亮区域.
highlightcolor 参考 highlightbackground.
highlightthickness 参考 highlightbackground.
justify 指示多行文本如何对齐. 可选项为 LEFT, RIGHT, CENTER. 默认为 LEFT. 注意: 该属性指示文字对齐方式. 如果要指定文字在控件内的位置, 请使用 anchor 属性.
padx 水平方向的边距. 默认为 -1, 即无边距.
pady 垂直方向的边距. 默认为 -1, 即无边距.
relief 边框样式. 默认为 FLAT. 其他可选项为 SUNKEN, RAISED, GROOVE, RIDGE.
takefocus 如果设置为 True, 控件将可以获取焦点. 默认为 False.
text 文字内容. 控件将根据宽度自动对文字进行断行.
textvariable 关联一个 Tkinter variable 对象, 通常为 StringVar 对象. 控件文本将在该对象改变时跟着改变.
width 控件宽度, 单位为 charater units (不是像素). 如果未指定该选项, 将根据 aspect 属性自动设置宽度.

(2)颜色的RGB表示法
R--Red
G--Green
B--Blue
R, G, B的取值范围为0x000xff,对应于十进制的0255

下表列举了几个常见的RGB值所对应的颜色

RGB值 颜色
#ff0000 红色
#00ff00 绿色
#0000ff 蓝色
#ffff00 黄色
#ff00ff 粉色
#00ffff 浅蓝色
#000000 黑色
#ffffff 白色
#555555 深灰色
#cccccc 浅灰色

(四)添加数字按纽

#数字按键
btn7 = tkinter.Button(root,text = '7',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('7'))
btn7.place(x = 0,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btn8 = tkinter.Button(root,text = '8',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('8'))
btn8.place(x = btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btn9 = tkinter.Button(root,text = '9',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('9'))
btn9.place(x = 2 * btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight) btn4 = tkinter.Button(root,text = '4',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('4'))
btn4.place(x = 0,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btn5 = tkinter.Button(root,text = '5',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('5'))
btn5.place(x = btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btn6 = tkinter.Button(root,text = '6',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('6'))
btn6.place(x = 2 * btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight) btn1 = tkinter.Button(root,text = '1',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('1'))
btn1.place(x = 0,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn2 = tkinter.Button(root,text = '2',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('2'))
btn2.place(x = btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn3 = tkinter.Button(root,text = '3',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('3'))
btn3.place(x = 2 * btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn0 = tkinter.Button(root,text = '0',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('0'))
btn0.place(x = btnWidth,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight)

运行结果:

 
2.png

说明:
(1)Button按纽属性

属性 描述
text 显示按纽内容
command 指定Button的事件处理函数
compound 指定文本与图像的位置关系
bitmap 指定位图
focus_set 设置当前组件得到的焦点
master 代表了父窗口
bg 设置背景颜色
fg 设置前景颜色
font 设置字体大小
height 设置显示高度、如果未设置此项,其大小以适应内容标签
relief 指定外观装饰边界附近的标签,默认是平的,可以设置的参数有flat、groove、raised、ridge、solid、sunken
width 设置显示宽度,如果未设置此项,其大小以适应内容标签
wraplength 将此选项设置为所需的数量限制每行的字符,数默认为0
state 设置组件状态;正常(normal),激活(active),禁用(disabled)
anchor 设置Button文本在控件上的显示位置,可取值:n(north),s(south),w(west),e(east),和ne,nw,se,sw
bd 设置Button的边框大小;bd(bordwidth)缺省为1或2个像素

(2)如果是在Mac下,上面的代码显示效果为

 
3.png

如果对按钮添加参数highlightbackgound='#cccccc',则显示效果为

 
4.png

这样倒是将按纽的整个边框都显示出来了,但是看起来怪怪的。这是因为tkinter对Mac系统支持得不好,有些属性不起作用的缘故。

(五)添加符号按纽

btnac = tkinter.Button(root,text = 'AC',bd = btnBorderWidth,font = ('黑体',fontSize),fg = 'orange',command = lambda :clickSign('AC'))
btnac.place(x = 0,y = processH + resultH,width = btnWidth,height = btnHeight)
btnback = tkinter.Button(root,text = '←',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('b'))
btnback.place(x = btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btndiv = tkinter.Button(root,text = '÷',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('/'))
btndiv.place(x = 2 * btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btnmul = tkinter.Button(root,text ='×',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('*'))
btnmul.place(x = 3 * btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btnsub = tkinter.Button(root,text = '-',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickSign('-'))
btnsub.place(x = 3 * btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btnadd = tkinter.Button(root,text = '+',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickSign('+'))
btnadd.place(x = 3 * btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btnequ = tkinter.Button(root,text = '=',bg = 'orange',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda :clickEqual())
btnequ.place(x = 3 * btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = 2 * btnHeight)
btnper = tkinter.Button(root,text = '%',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickPer())
btnper.place(x = 0,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight)
btnpoint = tkinter.Button(root,text = '.',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickNum('.'))
btnpoint.place(x = 2 * btnWidth,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight)

运行结果:

 
5.png

到这一步,界面都已经绘制完了。下一步要开始做功能。

(六)实现点击数字按钮的功能

lists = []                                    #数组,保存数字和运算符
isSignClicked = False #是否点击了符号按纽
isEqualClicked = False #是否点击了等号按纽 def clickNum(num):
global isSignClicked #将isSignClicked变量设为全局变量
global isEqualClicked if True == isSignClicked:
result.set(0) #如果上次按过运算符,那么这次要把原先的数字清空,否则会加在上次那个数的末尾
isSignClicked = False if True == isEqualClicked:
result.set(0)
isEqualClicked = False #判断界面的数字是否为0
oldnum = result.get()
if '0' == oldnum: #如果界面上数字为0 则获取按下的数字
if '.' == num:
num = '0.'
result.set(num)
else:
if '.' in oldnum and '.' == num: #如果之前已经输入过'.',那么再输入'.'不会有反应
pass
else:
newnum = oldnum + num
result.set(newnum) #将按下的数字写到面板中

运行结果:

 
6.png

这里的global关键字,可以参考
小朋友学Python(27):全局变量的引用和修改

(七)实现点击符号(百分号和等号除外)按纽的功能

#点击运算符号(等号除外)
def clickSign(sign):
global lists
global isSignClicked num = result.get() #获取界面数字
if 0 == num.find('='): #在连续计算时,若得到的是“=15”,要去掉等号,取其数字
num = num[1:len(num)]
lists.append(num) #将界面获取的数字保存列表中 lists.append(sign) #将运算符号保存到列表中
isSignClicked = True if 'AC' == sign: #如果按下的是'AC'按键,则清空列表内容,并将屏幕上的数字设置为默认值0
lists.clear()
process.set('')
result.set(0)
if 'b' == sign: #如果按下的是退格按纽,则选取当前数字第一位到倒数第二位
a = num[0:-1]
lists.clear()
result.set(a)
if 0 == len(a): #如果是最后一个数,退格后变成0
result.set(0)

(八)实现点击“%”的功能

#求百分值
def clickPer():
curval = result.get()
lists.append(curval)
lists.append('/')
lists.append('100')
res = ''.join(lists)
res = eval(res)
result.set(res)
lists.clear()

这里的join函数和eval函数,可以参考
小朋友学Python(28):join方法和eval方法

(九)实现点击“=”的功能

#获取运算结果
def clickEqual():
global lists
global isEqualClicked isEqualClicked = True
curval = result.get() #将界面上的数字添加到列表中
# 2*=4, 4*=16, 16*=256, 如果按了*=之前,有等号的话,要把等号去掉
if True == isSignClicked and 0 == curval.find('='):
curval = curval[1:len(curval)]
lists.append(curval) proc = ''.join(lists) #将列表内容用join命令将字符串链接起来
res = eval(proc) #用eval命令运算字符串中的内容
res = '='+str(res) #给运算结果前添加一个 ‘=’ 显示
res = res[0:10] #所有的运算结果取9位数 process.set(proc) #显示运算过程
result.set(res) #显示运算结果 lists.clear() #清空lists数组中的内容

运行结果:

 
7.png

(十)调整两个Label的颜色

过程Label和结果Label的背景色很不好看,将两个Label的背景色都调为:
bg = ‘#EEE9E9’

运行效果:

 

实现带UI的简易计算器(下)

一、最终效果

 
8.png

二、完整程序

import tkinter #导入tkinter模块

#定义数值
w = 280 #整个界面的宽度
h = 480 #整个界面的高度
processH = 120 #存放计算过程的Label的高度
resultH = 60 #存放计算结果的Label的高度
btnWidth = 70 #按纽宽度
btnHeight = 60 #按纽高度
msfont = '微软雅黑' #微软雅黑字体
fontSize = 20 #字体大小
btnFgColor = '#4F4F4F' #按纽颜色
btnBorderWidth = 0.5 #按纽边框粗细 #面板设置
root = tkinter.Tk()
root.minsize(w,h) #面板大小的最小值
root.title('海天一树的计算器') #面板的标题 process = tkinter.StringVar() #字符串用于存放计算过程,初始状态为空
process.set('')
result = tkinter.StringVar() #字符串用于存放计算结果,初始状态为0
result.set(0) #labelProcess用于显示计算过程,labelResult用于显示计算结果
labelProcess = tkinter.Label(root,font = (msfont,fontSize),bg = '#EEE9E9',bd ='9',fg = '#828282',anchor = 'se',textvariable = process)
labelProcess.place(width = w,height = processH)
labelResult = tkinter.Label(root,font = (msfont,30),bg = '#EEE9E9',bd ='9',fg = 'black',anchor = 'se',textvariable = result)
labelResult.place(y = processH,width = w,height = resultH) #数字按键
btn7 = tkinter.Button(root,text = '7',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('7'))
btn7.place(x = 0,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btn8 = tkinter.Button(root,text = '8',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('8'))
btn8.place(x = btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btn9 = tkinter.Button(root,text = '9',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('9'))
btn9.place(x = 2 * btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight) btn4 = tkinter.Button(root,text = '4',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('4'))
btn4.place(x = 0,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btn5 = tkinter.Button(root,text = '5',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('5'))
btn5.place(x = btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btn6 = tkinter.Button(root,text = '6',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('6'))
btn6.place(x = 2 * btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight) btn1 = tkinter.Button(root,text = '1',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('1'))
btn1.place(x = 0,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn2 = tkinter.Button(root,text = '2',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('2'))
btn2.place(x = btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn3 = tkinter.Button(root,text = '3',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('3'))
btn3.place(x = 2 * btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn0 = tkinter.Button(root,text = '0',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('0'))
btn0.place(x = btnWidth,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight) #运算符号按键
btnac = tkinter.Button(root,text = 'AC',bd = btnBorderWidth,font = ('黑体',fontSize),fg = 'orange',command = lambda :clickSign('AC'))
btnac.place(x = 0,y = processH + resultH,width = btnWidth,height = btnHeight)
btnback = tkinter.Button(root,text = '←',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('b'))
btnback.place(x = btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btndiv = tkinter.Button(root,text = '÷',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('/'))
btndiv.place(x = 2 * btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btnmul = tkinter.Button(root,text ='×',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('*'))
btnmul.place(x = 3 * btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btnsub = tkinter.Button(root,text = '-',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickSign('-'))
btnsub.place(x = 3 * btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btnadd = tkinter.Button(root,text = '+',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickSign('+'))
btnadd.place(x = 3 * btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btnequ = tkinter.Button(root,text = '=',bg = 'orange',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda :clickEqual())
btnequ.place(x = 3 * btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = 2 * btnHeight)
btnper = tkinter.Button(root,text = '%',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickPer())
btnper.place(x = 0,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight)
btnpoint = tkinter.Button(root,text = '.',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickNum('.'))
btnpoint.place(x = 2 * btnWidth,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight) #点击数字
lists = [] #数组,保存数字和运算符
isSignClicked = False #是否点击了符号按纽
isEqualClicked = False #是否点击了等号按纽 def clickNum(num):
global isSignClicked #将isSignClicked变量设为全局变量
global isEqualClicked if True == isSignClicked:
result.set(0) #如果上次按过运算符,那么这次要把原先的数字清空,否则会加在上次那个数的末尾
isSignClicked = False if True == isEqualClicked:
result.set(0)
isEqualClicked = False #判断界面的数字是否为0
oldnum = result.get()
if '0' == oldnum: #如果界面上数字为0 则获取按下的数字
if '.' == num:
num = '0.'
result.set(num)
else:
if '.' in oldnum and '.' == num: #如果之前已经输入过'.',那么再输入'.'不会有反应
pass
else:
newnum = oldnum + num
result.set(newnum) #将按下的数字写到面板中 #点击运算符号(等号除外)
def clickSign(sign):
global lists
global isSignClicked num = result.get() #获取界面数字
if 0 == num.find('='): #在连续计算时,若得到的是“=15”,要去掉等号,取其数字
num = num[1:len(num)]
lists.append(num) #将界面获取的数字保存列表中 lists.append(sign) #将运算符号保存到列表中
isSignClicked = True if 'AC' == sign: #如果按下的是'AC'按键,则清空列表内容,并将屏幕上的数字设置为默认值0
lists.clear()
process.set('')
result.set(0)
if 'b' == sign: #如果按下的是退格按纽,则选取当前数字第一位到倒数第二位
a = num[0:-1]
lists.clear()
result.set(a)
if 0 == len(a): #如果是最后一个数,退格后变成0
result.set(0) #求百分值
def clickPer():
curval = result.get()
lists.append(curval)
lists.append('/')
lists.append('100') res = ''.join(lists)
res = eval(res)
result.set(res) lists.clear() #获取运算结果
def clickEqual():
global lists
global isEqualClicked isEqualClicked = True
curval = result.get() #将界面上的数字添加到列表中
# 2*=4, 4*=16, 16*=256, 如果按了*=之前,有等号的话,要把等号去掉
if True == isSignClicked and 0 == curval.find('='):
curval = curval[1:len(curval)]
lists.append(curval) proc = ''.join(lists) #将列表内容用join命令将字符串链接起来
res = eval(proc) #用eval命令运算字符串中的内容
res = '='+str(res) #给运算结果前添加一个 ‘=’ 显示
res = res[0:10] #所有的运算结果取9位数 process.set(proc) #显示运算过程
result.set(res) #显示运算结果 lists.clear() #清空lists数组中的内容 root.mainloop()

三、Github源码下载

https://github.com/zhenghaishu/Calculator-Python

小朋友学Python(4)的更多相关文章

  1. 小朋友学Python(1):Python简介与编程环境搭建

    一.Python简介 不死Java,不朽C/C++,新贵Python. Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰 ...

  2. 小朋友学Python(3)

    运算符 一.基本运算符 Python运算符多数与C/C++/Java类似,但有少数不一样. “/”表示求商,“//”求商的整数部分.11 / 2 = 5.500000, 11 // 2 = 5 “** ...

  3. 小朋友学Python(2)

    本节学习python的第一个程序:输出“Hello World!”.咱们用两种方法实现 方法(一) 进入python环境,直接使用print方法   hello world.png 方法(二) 先编程 ...

  4. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  5. <-0基础学python.第一课->

    初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ...

  6. 学Python后到底能干什么?

    Python是一种什么语言? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Jav ...

  7. 关于智普 - 千人免费学|Python培训|国内最权威python培训|html5

    关于智普 - 千人免费学|Python培训|国内最权威python培训|html5 智普教育隶属于北京顶嵌开源科技有限公司,成立于2008年. 智普开源是基于Linux系统的互联网开源学习平台,讲求务 ...

  8. [置顶] 和孩子们一起学Python编程

    1. 推荐书名 Computer Programming for Kids and Other Beginners in Python, 4Ed.pdf     中文译名:<和孩子们一起学Pyt ...

  9. 简学Python第二章__巧学数据结构文件操作

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

随机推荐

  1. 解决tensorflow的"Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Using TensorFlow backend."警告问题

    问题描述 程序开始运行的时候报出警告:I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructio ...

  2. 前端开发 —— js 常用工具函数(utilities)

    1. 时间 function getCurTime() { var date = new Date(); return date.toLocaleTimeString(); } date.toLoca ...

  3. Robot Framework 安装笔记

    安装python 自行搜寻安装 安装pip 进入python目录下的Scripts文件夹下,cmd,执行easy_install.exe pip 安装pywin32 pip install pywin ...

  4. Roslyn编译器-C#动态脚本实现方案

    [前言] Roslyn 是微软公司开源的 .NET 编译器. 编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API. Roslyn不仅仅可以直接编译输出,难能可贵的就 ...

  5. shell 命令学习

    https://blog.csdn.net/mnmlist/article/details/55215158

  6. BatSendMail

    @echo off echo ==================================echo == Compress Files And Send Mail ==echo ======= ...

  7. Linux高级文本处理命令

    cut 一.cut命令 功能:cut命令可以从一个文本文件/文本流中提取文本列 语法: cut -d '分割字符' -f fields ##用于有特定分割字符 cut -c 字符区间 ##用于排列整齐 ...

  8. 【转】每天一个linux命令(15):tail 命令

    原文网址:http://www.cnblogs.com/peida/archive/2012/11/07/2758084.html tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f ...

  9. Oracle ASM 详解

    ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也是由实例和文件组成, 也可以 ...

  10. java 多线程之:synchronized

    synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在. 当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,syn ...