刚接触python gui ,先用tkinger练下手
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#学习简单GUI,练习写个计算器小程序,利用eval
#仅用来熟悉Tkinter和python 不做过多复杂功能
from tkinter import *
class App(object):
#构造函数初始化.在构造函数中用self.来创建属性并初始化....
#类下面只能有函数,区分C++
#类的成员函数第一个参数必须是self
#类的属性/数据成员要用self.xxxx来声明和初始化
def __init__(self,master):
print(master.title() + ':loading')
#grid方格大小设置
for r in range(0,6):
master.grid_rowconfigure(r,pad = 50)
for c in range(0,3):
master.grid_columnconfigure(c,pad = 50)
#按键
btnText = (
('1','2','3'),
('4','5','6'),
('7','8','9'),
('0','+','-'),
('*','/','=')
)
# 直接写函数只能每个按钮写一个函数,代码很难接受
# 如果要使用command, lambda 可以做到函数传递函数
# 也就是同一函数经过lambda 和lambda 的参数包装后 ,不同参数进入生成不同函数形态
# 就可以做到不用一个BUTTON就写一条函数 ,而是一个"生成函数的函数"解决问题
# 在下面问题中 lambda 生成的函数都会带着参数调用(指向)同一个函数self.btnClick
# ------------------------------------------------------------------------------
# 正确写法 command = (lambda t = btnText[r][c]:self.btnClick(t))
# 正确写法中 lambda 有一个参数 t ,会根据不同参数生成不同函数 ,返回值与参数相关
# 可以正确输出跟参数相关的返回值
# ------------------------------------------------------------------------------
# 错误写法 command = (lambda :self.btnClick(btnText[r][c]))
# 错误写法中 lambda 没有参数, 那么只会生成一条函数,所有按钮都指向同一函数
# 导致最终输出的返回值只有一个(也就是最后一次调用函数的状态)
# ------------------------------------------------------------------------------
for r in range(0,5):
for c in range(0,3):
b = Button(master,text = btnText[r][c],
command = (lambda t = btnText[r][c]:self.btnClick(t)))
b.grid(row = r + 1,column = c)
# 这只是个熟悉GUI的练习,使用command
# 另一种方法使用 bind 绑定按键 和 传递参数 比command更容易扩展
#标签
#这里翻车了,记得python对象的属性/数据成员,在构造函数中用self.XXXX声明和初始化
self.labelTextVar = StringVar() #要改变数据并同步到画面上用Tkinter自带变量类型
self.labelTextVar.set('testLabel')
self.lab1 = Label(master,textvariable = self.labelTextVar)
self.lab1.grid(row = 0,column = 0,columnspan = 3) #列跨度3
#事件处理函数
def btnClick(self,t):
print('click:' + t)
if t=='=':
#正则表达式测试输入是否合法
reMatchRes = re.match(r'^([0-9]{1,}[\+\-\*\/]{1}){1,}[0-9]{1,}$',
self.labelTextVar.get())
if reMatchRes is not None:
calcRes = eval(self.labelTextVar.get())
self.labelTextVar.set(calcRes)
print('re match succes: calc = ' + str(calcRes))
else:
self.labelTextVar.set('')
print('re match fail: clear label')
else:
self.labelTextVar.set(self.labelTextVar.get() + t)
#-----------------------------------------------------------------------------------------
root = Tk()
root.title('"title:calcTest"')
app = App(root)
root.mainloop()