欢迎,来自IP地址为:98.81.24.230 的朋友
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的强大吧。