欢迎,来自IP地址为:111.178.86.187 的朋友
Python语言提供了众多开发GUI(Graphical User Interface图形用户界面)应用的选择,但是Tkinter却是应用最为广泛的一种。其根本原因在于Tkinter是跨平台的,即在windows系统和Linux系统都可以正常使用。本教程将采用Tkinter编写简单GUI计算器Python程序。
什么是Tkinter
Tkinter(TK interface)模块是一个标准TK GUI工具集Python接口
TK和TKinter在大多数类Unix和Windows平台都可以使用
如果在类Unix平台上使用TKinter,则需要安装这个模块;而在Windows平台,TKinter和Python同时安装
Python计算器程序必备条件
为了开发Python GUI计算器程序,需要系统具备以下两个模块:
TKinter
Lambda
GUI计算器的外观
上图就是程序的基本外观,看起来是不是很酷呢。这个计算器不仅可以看,并且提供了简单的四则运算功能。
现在就开始使用Python来编写这个计算器程序。程序大致包含以下四个部分:
导入TKinter模块
创建主界面(以Windwos平台为例,创建用户窗口)
为主界面添加功能按键
为每个功能按键添加事件触发器侦听并响应事件
创建主界面
首先,需要创建程序的主窗体界面,编写代码如下:
from tkinter import *
# Creating frame for calculator
def iCalc(source, side):
storeObj = Frame(source, borderwidth=4, bd=4, bg="powder blue")
storeObj.pack(side=side, expand =YES, fill =BOTH)
return storeObj
# Creating Button
def button(source, side, text, command=None):
storeObj = Button(source, text=text, command=command)
storeObj.pack(side=side, expand = YES, fill=BOTH)
return storeObj
class app(Frame):
def __init__(self):
Frame.__init__(self)
self.option_add('*Font', 'arial 20 bold')
self.pack(expand = YES, fill =BOTH)
self.master.title('Calculator')
# Start the GUI
if __name__=='__main__':
app().mainloop()
试着运行一下程序,如果出现如下界面,则表示计算器的界面框架可以正常运行了:
主界面完成后,就可以继续进行下一步步骤了。
添加功能按键
添加显示功能部件
为了让计算器可以显示输入内容和输出结果,则需要在app类的代码内部添加如下内容:
class app(Frame):
def __init__(self):
Frame.__init__(self)
self.option_add('*Font', 'arial 20 bold')
self.pack(expand = YES, fill =BOTH)
self.master.title('Calculator')
display = StringVar()
Entry(self, relief=RIDGE, textvariable=display,justify='right',
bd=30, bg="powder blue").pack(side=TOP,expand=YES, fill=BOTH)
现在,程序的输出会如下图所示:
添加清除功能按钮
现面,要创建一个清除按钮。当按下这个按钮后,所有显示部件的内容全部被清空。继续在类app中添加如下代码:
for clearButton in (["C"]):
erase = iCalc(self, TOP)
for ichar in clearButton:
button(erase, LEFT, ichar, lambda storeObj=display, q=ichar: storeObj.set(''))
现在,计算器的界面将会变成下图的样子:
添加数字和运算符按钮
使用如下代码,将会添加数字和运行符按钮到计算器的主界面,同样的,代码需要添加在类app中:
for numButton in ("789/", "456*", "123-", "0.+"):
FunctionNum = iCalc(self, TOP)
for iEquals in numButton:
button(FunctionNum, LEFT, iEquals, lambda
storeObj=display, q=iEquals: storeObj
.set(storeObj.get() + q))
现在再运行程序,会发现计算器已经似模似样了:
添加等于按钮
最后向类app中添加如下代码,用于增加等于按钮:
EqualButton = iCalc(self, TOP)
for iEquals in "=":
if iEquals == '=':
btniEquals = button(EqualButton, LEFT, iEquals)
btniEquals.bind('', lambda e,s=self,
storeObj=display: s.calc(storeObj), '+')
else:
btniEquals = button(EqualButton, LEFT, iEquals,
lambda storeObj=display, s=' %s ' % iEquals: storeObj.set
(storeObj.get() + s))
计算器界面全部完成后的样子,如下图所示:
为按钮部件应用事件触发器
最后一步也是最重要的一步,就是为每个按钮部件添加事件触发器,用于侦听特定事件并做出相应的处理,让计算器不仅可以看,还可以计算并输出结果。在类app中添加一个cacl方法用于计算并输出结果:
def calc(self, display):
try:
display.set(eval(display.get()))
except:
display.set("ERROR")
现在,一个简单的Python GUI计算器就全部完成了,全部代码如下:
from tkinter import *
def iCalc(source, side):
storeObj = Frame(source, borderwidth=4, bd=4, bg="powder blue")
storeObj.pack(side=side, expand =YES, fill =BOTH)
return storeObj
def button(source, side, text, command=None):
storeObj = Button(source, text=text, command=command)
storeObj.pack(side=side, expand = YES, fill=BOTH)
return storeObj
class app(Frame):
def __init__(self):
Frame.__init__(self)
self.option_add('*Font', 'arial 20 bold')
self.pack(expand = YES, fill =BOTH)
self.master.title('Calculator')
display = StringVar()
Entry(self, relief=RIDGE, textvariable=display,
justify='right'
, bd=30, bg="powder blue").pack(side=TOP,
expand=YES, fill=BOTH)
for clearButton in (["C"]):
erase = iCalc(self, TOP)
for ichar in clearButton:
button(erase, LEFT, ichar, lambda
storeObj=display, q=ichar: storeObj.set(''))
for numButton in ("789/", "456*", "123-", "0.+"):
FunctionNum = iCalc(self, TOP)
for iEquals in numButton:
button(FunctionNum, LEFT, iEquals, lambda
storeObj=display, q=iEquals: storeObj
.set(storeObj.get() + q))
EqualButton = iCalc(self, TOP)
for iEquals in "=":
if iEquals == '=':
btniEquals = button(EqualButton, LEFT, iEquals)
btniEquals.bind('', lambda e,s=self,
storeObj=display: s.calc(storeObj), '+')
else:
btniEquals = button(EqualButton, LEFT, iEquals,
lambda storeObj=display, s=' %s ' % iEquals: storeObj.set
(storeObj.get() + s))
def calc(self, display):
try:
display.set(eval(display.get()))
except:
display.set("ERROR")
if __name__=='__main__':
app().mainloop()
最后,运行一下程序,仔细体会TKinter的强大吧。