最近一段时间一直在学习python的GUI编程部分,也算有了一点成果,举两个小实例如下:
(一)登录页面的源代码:
import tkinter
import tkinter.messagebox
import os
import os.path
path = os.getenv('temp')
filename = os.path.join(path,'info.txt')
root = tkinter.Tk()
root['height'] = 140
root['width'] = 200
labelName = tkinter.Label(root,text='User Name:',justify = tkinter.RIGHT,\
anchor='e',width=80)
labelName.place(x=10,y=5,width=80,height=20)
varName = tkinter.StringVar(root,value='')
entryName = tkinter.Entry(root,width=80,textvariable=varName)
entryName.place(x=100,y=5,width=80,height=20)
LabelPwd = tkinter.Label(root,text='User Pwd:',justify=tkinter.RIGHT,\
anchor='e',width=80)
LabelPwd.place(x=10,y=30,width=80,height=20)
varPwd = tkinter.StringVar(root,value='')
entryPwd = tkinter.Entry(root,show='*',width=80,textvariable=varPwd)
entryPwd.place(x=100,y=30,width=80,height=20)
try:
with open(filename) as fp:
n,p = fp.read().strip().split(',')
varName.set(n)
varPwd.set(p)
except:
pass
#Remember me 复选框
rememberMe = tkinter.IntVar(root,value=1)
checkRemember = tkinter.Checkbutton(root,text='Remember me?',variable=rememberMe,onvalue=1,offvalue=0)
checkRemember.place(x=30,y=70,width=120,height=20)
#登录按钮事件处理函数
def login():
#获取用户名和密码
name = entryName.get()
pwd = entryPwd.get()
if name == 'HMCe' and pwd == '20011022':
tkinter.messagebox.showinfo(title='恭喜',message='登录成功!')
if rememberMe.get()==1:
with open(filename,'w') as fp:
fp.write(','.join((name,pwd)))
else:
try:
os.remove(filename)
except:
pass
else:
tkinter.messagebox.showerror('警告',message='用户名或密码错误')
#创建按钮组件,同时设置按钮事件处理函数
buttonOk = tkinter.Button(root,text='Login',command=login)
buttonOk.place(x=30,y=100,width=50,height=20)
#取消按钮的事件处理函数
def cancel():
#清空用户输入的用户名和密码
varName.set('')
varPwd.set('')
buttonCancel = tkinter.Button(root,text='Cancel',command=cancel)
buttonCancel.place(x=90,y=100,width=50,height=20)
#启动消息循环
root.mainloop()
运行结果如下:
(二)简易计算器的源代码:
import re
import tkinter
import tkinter.messagebox
root = tkinter.Tk()
root.geometry('300x270+400+100')
root.resizable(False, False)
root.title('简易计算器——小胡')
contentVar = tkinter.StringVar(root, '')
contentEntry = tkinter.Entry(root, textvariable=contentVar)
contentEntry['state'] = 'readonly'
contentEntry.place(x=10, y=10, width=280, height=20)
def buttonClick(btn):
content = contentVar.get()
if content.startswith('.'):
content = '0' + content
if btn in '0123456789':
content += btn
elif btn == '.':
lastPart = re.split(r'\+|-|\*|/]', content)[-1]
if '.' in lastPart:
tkinter.messagebox.showerror('错误', '小数点太多了')
return
else:
content += btn
elif btn == 'C':
content = ''
elif btn == '=':
try:
content = str(eval(content))
except:
tkinter.messagebox.showerror('错误', '表达式错误')
return
elif btn in operators:
if content.endswith(operators):
tkinter.messagebox.showerror('错误', '不允许存在连续运算符')
return
content += btn
elif btn == 'Sqrt':
n = content.split('.')
if all(map(lambda x: x.isdigit(), n)):
content = eval(content) ** 0.5
else:
tkinter.messagebox.showerror('错误', '表达式错误')
return
contentVar.set(content)
btnClear = tkinter.Button(root, text='Clear', command=lambda: buttonClick('C'))
btnClear.place(x=40, y=40, width=80, height=20)
btnCompute = tkinter.Button(root, text='=', command=lambda: buttonClick('='))
btnCompute.place(x=170, y=40, width=80, height=20)
digits = list('0123456789.') + ['Sqrt']
index = 0
for row in range(4):
for col in range(3):
d = digits[index]
index += 1
btnDigit = tkinter.Button(root, text=d, command=lambda x=d: buttonClick(x))
btnDigit.place(x=20 + col * 70, y=80 + row * 50, width=50, height=20)
operators = ('+', '-', '*', '/', '**', '//')
for index, operator in enumerate(operators):
btnOperator = tkinter.Button(root, text=operator, command=lambda x=operator: buttonClick(x))
btnOperator.place(x=230, y=80 + index * 30, width=50, height=20)
root.mainloop()
运行结果如下:
这两个小实例算是入门级别的GUI编程基础训练,建议初学者可以先行尝试这两个实例,之后再尝试其他的典型实例,其他的典型事例见Python的GUI编程小实例(Tkinter模块)(下)。