IP Address: 34.203.225.78



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的强大吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注