小朋友学Python(4)
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版本(公测版)

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

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

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的简易计算器(上)
一、需求
实现一个简易计算器,用户界面类似小米手机的计算器。

二、编程环境
语言: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)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)
运行结果:

说明:
(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下,上面的代码显示效果为

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

这样倒是将按纽的整个边框都显示出来了,但是看起来怪怪的。这是因为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)
运行结果:

到这一步,界面都已经绘制完了。下一步要开始做功能。
(六)实现点击数字按钮的功能
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)          #将按下的数字写到面板中
运行结果:

这里的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数组中的内容
运行结果:

(十)调整两个Label的颜色
过程Label和结果Label的背景色很不好看,将两个Label的背景色都调为:
bg = ‘#EEE9E9’
运行效果:

实现带UI的简易计算器(下)
一、最终效果

二、完整程序
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)的更多相关文章
- 小朋友学Python(1):Python简介与编程环境搭建
		一.Python简介 不死Java,不朽C/C++,新贵Python. Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰 ... 
- 小朋友学Python(3)
		运算符 一.基本运算符 Python运算符多数与C/C++/Java类似,但有少数不一样. “/”表示求商,“//”求商的整数部分.11 / 2 = 5.500000, 11 // 2 = 5 “** ... 
- 小朋友学Python(2)
		本节学习python的第一个程序:输出“Hello World!”.咱们用两种方法实现 方法(一) 进入python环境,直接使用print方法 hello world.png 方法(二) 先编程 ... 
- 【Python五篇慢慢弹】快速上手学python
		快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ... 
- <-0基础学python.第一课->
		初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ... 
- 学Python后到底能干什么?
		Python是一种什么语言? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Jav ... 
- 关于智普 - 千人免费学|Python培训|国内最权威python培训|html5
		关于智普 - 千人免费学|Python培训|国内最权威python培训|html5 智普教育隶属于北京顶嵌开源科技有限公司,成立于2008年. 智普开源是基于Linux系统的互联网开源学习平台,讲求务 ... 
- [置顶] 和孩子们一起学Python编程
		1. 推荐书名 Computer Programming for Kids and Other Beginners in Python, 4Ed.pdf 中文译名:<和孩子们一起学Pyt ... 
- 简学Python第二章__巧学数据结构文件操作
		#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ... 
随机推荐
- vue 移动端添加 时间日期选择器
			效果: index.vue <template> <div class="user-wrap" style="padding-bottom: 0;tex ... 
- kafka集群安装,配置
			1.安装+配置(集群) 192.168.0.10.192.168.0.11.192.168.0.12(每台服务器kafka+zookeeper) # kafka依赖java环境,需要提前安装好jdk. ... 
- linux配置禁用启用IPv6
			IPv6被认为是IPv4的替代产品,它用来解决现有IPv4地址空间即将耗尽的问题.但目前,开启IPv6可能会导致一些问题.因此有时我们需要关闭IPv6.下面是IPv6的关闭方法应该适用于所有主流的Li ... 
- webbench-1.5_hacking
			/**************************************************************************** * * webbench-1.5_hacki ... 
- C#浮点数保留位数
			C#浮点数保留位数 这里用String.Forma("{0:F}",x);来解决. 下面是试验和截图 using System; using System.Collections. ... 
- Fzu软工第二次作业-词频分析
			(0)前言: Github项目 作业地址 (1)PSP表格: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 ... 
- hdu2079 选课时间(题目已修改,注意读题) 母函数
			计算数的和的种类,母函数裸题 #include<stdio.h> #include<string.h> ],c2[],a,b; int main(){ int T; while ... 
- test20181016 B君的第二题
			题意 分析 考场暴力50分. 考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了. 时间复杂度\(O(n \log n + m \log n)\) #inclu ... 
- USB设备驱动_WDS
			1. usb_alloc_dev中的 bus_type 中指定了匹配函数,和uevent中的环境参数. ====>不同的bus_type的匹配函数可能是不同的,uevent的环境变量参数也可能是 ... 
- 两个有用Oracle运算:intersect和minus运算
			intersect运算 返回查询结果中相同的部分 exp:各个部门中有哪些相同的工种 select job from account intersect select job from researc ... 
