小朋友学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源码下载
小朋友学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 ...
随机推荐
- 解决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 ...
- 前端开发 —— js 常用工具函数(utilities)
1. 时间 function getCurTime() { var date = new Date(); return date.toLocaleTimeString(); } date.toLoca ...
- Robot Framework 安装笔记
安装python 自行搜寻安装 安装pip 进入python目录下的Scripts文件夹下,cmd,执行easy_install.exe pip 安装pywin32 pip install pywin ...
- Roslyn编译器-C#动态脚本实现方案
[前言] Roslyn 是微软公司开源的 .NET 编译器. 编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API. Roslyn不仅仅可以直接编译输出,难能可贵的就 ...
- shell 命令学习
https://blog.csdn.net/mnmlist/article/details/55215158
- BatSendMail
@echo off echo ==================================echo == Compress Files And Send Mail ==echo ======= ...
- Linux高级文本处理命令
cut 一.cut命令 功能:cut命令可以从一个文本文件/文本流中提取文本列 语法: cut -d '分割字符' -f fields ##用于有特定分割字符 cut -c 字符区间 ##用于排列整齐 ...
- 【转】每天一个linux命令(15):tail 命令
原文网址:http://www.cnblogs.com/peida/archive/2012/11/07/2758084.html tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f ...
- Oracle ASM 详解
ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也是由实例和文件组成, 也可以 ...
- java 多线程之:synchronized
synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在. 当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,syn ...