20212325 基于python的Tkinter实现简易计算器


Python的GUI编程

Python 提供了多个图形开发界面的库,以下是几个常用的 Python GUI 库:

tkinter: tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能健全的 GUI 用户界面。
Jython:Jython 程序可以和 Java 无缝集成。除了一些标准模块,Jython 使用 Java 的模块。Jython 几乎拥有标准的Python 中不依赖于 C 语言的全部模块。比如,Jython 的用户界面将使用 Swing,AWT或者 SWT。Jython 可以被动态或静态地编译成 Java 字节码。

使用tkinter库实现简易计算器

我们再仔细了解一下tkinter:

tkinter是一个开放源码的图形接口开发工具,原来是用TCL(Tool Command Language,工具命令语言)编写的GUI函数库,最初发展是从1991年开始,具有跨平台的特性,可以在Linux、Windows、Mac OS等操作系统上执行。tkinter工具提供许多图形接口,例如标签(Label)、菜单(Menu)、按钮(Button)等。目前,tkinter工具已经移植到python语言,属于python语言内置的模块,在Python2版本中该模块名称是tkinter,在Python3版本中该模块被称为tkinter模块。

导入

在安装Python时,就已同时安装此模块了,只需导入即可:

  from tkinter import * 

在正式使用前可以先了解一下自己的tkinter版本:

  import tkinter
  print(tkinter.TkVersion)

执行结果:

一般8.5之后的功能比较齐全。

建立窗口

通常将使用Tk()方法建立的窗口称为根除窗口,即root,可以取做其他名称,本次实现简易计算器,故取做calculator。之后我们可以在根窗口中建立许多控件或上层窗口。

  root = Tk()
  root.title("calcutor")

如果只是想建立窗口,要用mainloop()让程序执行,放在程序最后一行。

  root.mainloop()       

上图是以默认大小出现的名为calculator的根窗口
在GUI程序设计中,有时也将建立的窗口称为容器(container)

容器

在此简单介绍一下容器:

框架Frame是tkinter的容器控件,以下为Frame( )方法常用的options参数:

参数名 作用
bg或background 背景色彩
borderwidth或bd 标签边界宽度,默认是2
cursor 当鼠标光标在框架上时的光标形状
height 框架的高度,单位是像素pixel
highlightbackground 当框架没有取得焦点时的颜色
highlightcolor 当框架取得焦点时的颜色
relief 默认是relief=FLAT,可由此控制框架外框
width 框架的宽度,单位是像素pixel,省略时会自行调整为实际宽度
  import tkinter
  from tkinter.constants import LEFT

  root = tkinter.Tk()
  root.title("calculator")


  frame = tkinter.Frame(root,bg= "orange")
  frame.pack()
  Btn1=
  tkinter.Button(frame,text="1",fg="orange")
  Btn1.pack(side=LEFT,padx=5,pady=5)


  root.mainloop()    

如图为利用Frame建立按钮
说到按钮,就不得不提到tkinter中的按钮控件,这也是在实现简易计算器中必不可少的部分,按钮属于tkinter中的组件,让我们来了解一下组件有哪些

tkinter组件

目前有15种tkinter组件,也叫部件,如下:

组件 描述
Button 按钮控件;在程序中显示按钮
Canvas 画布控件;显示图形元素如线条或文本
Checkbutton 多选框控件;用于在程序中提供多项选择框
Entry 输入控件;用于显示简单的文本内容
Frame 框架控件;在屏幕上显示一个矩形区域,多用来作为容器
Label 标签控件;可以显示文本和位图
Listbox 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户
Menubutton 菜单按钮控件,用于显示菜单项
Menu 菜单控件;显示菜单栏,下拉菜单和弹出菜单
Message 消息控件;用来显示多行文本,与label比较类似
Radiobutton 单选按钮控件;显示一个单选的按钮状态
Scale 范围控件;显示一个数值刻度,为输出限定范围的数字区间
Scrollbar 滚动条控件,当内容超过可视化区域时使用,如列表框
Text 文本控件;用于显示多行文本
Toplevel 容器控件;用来提供一个单独的对话框,和Frame比较类似
Spinbox 输入控件;与Entry类似,但是可以指定输入范围值
PanedWindow PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件
LabelFrame labelframe 是一个简单的容器控件。常用与复杂的窗口布局
tkMessageBox 用于显示应用程序的消息框

tkinter几何管理

Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织:

几何方法 描述
pack( ) 包装
grid( ) 网格
place( ) 位置

在本次实现简易计算器中,我们预设需要有显示区,按键0-9以及运算符号,这是简易布局;还有鼠标点击按键时,按键的值能显示出来,能计算出运算结果,以及能够清空来进行下一次输入,这是完整设计。当然,如果想要更加完善得使用计算器,我们还希望它的界面能放大缩小。在这其中,我们会使用到Button控件,Label控件以及grid( )语法等。
在Flame( )的示例中展示了Button的用法,但是在实现简易计算器的过程中,不同的按钮需要传递的参数不同,此时我们需要使用Lambda表达式通过调用相同的方法但是传递不同参数的方式简化设计。

Lambda表达式

语法格式为:

lambda 参数值列表:表达式
参数值列表为输入,表达式计算的结构为输出
我们再给函数传递参数时,需要使用lambda函数

grid方法

grid方法是一种以格状或类似Excel电子表格方式包装和定位窗口组件的方法,其语法格式为grid(options,···)
options参数可以是row、column、padx/pady、rowspan、columnspan、sticky等

row和column参数:

  import tkinter
 
  root = tkinter.Tk()
  root.title("calculator")

  lab = tkinter.Label(root,text="",bg="yellow",width=20)
  btn7 = tkinter.Button(root,text="7",width=3)


  lab .grid(row=0,column=0,columnspan=4)
  btn7.grid(row=1,column=0,padx=5)


  root.mainloop()     

如图为设置一个按钮

以下为源代码:

from tkinter import *

def calculate():
    result = eval(equ.get())
    equ.set(equ.get() + "=\n" + str(result))

def show(buttonString):
    content = equ.get()
    if content == "0":
        content = ""
    equ.set(content + buttonString)


def backspace():
    equ.seet(str(equ.get()[:-1]))



def clear():
    equ.set("0")


root = Tk()
root.title("calcutor")

equ = StringVar()
equ.set("0")



label = Label(root,width=25,height=2,relief="raised",anchor=SE,textvariable=equ)
label.grid(row=0,column=0,columnspan=4,padx=5,pady=5)

clearButton = Button(root,text="C",fg="blue",width=5,command=clear)
clearButton.grid(row = 1,column = 0)

Button(root,text="DEL",width=5,command=backspace).grid(row=1,column=1)
Button(root,text="%",width=5,command=lambda:show("%")).grid(row=1,column=2)
Button(root,text="/",width=5,command=lambda:show("/")).grid(row=1,column=3)

Button(root,text="7",width=5,command=lambda:show("7")).grid(row=2,column=0)
Button(root,text="8",width=5,command=lambda:show("8")).grid(row=2,column=1)
Button(root,text="9",width=5,command=lambda:show("9")).grid(row=2,column=2)
Button(root,text="x",width=5,command=lambda:show("*")).grid(row=2,column=3)


Button(root,text="4",width=5,command=lambda:show("4")).grid(row=3,column=0)
Button(root,text="5",width=5,command=lambda:show("5")).grid(row=3,column=1)
Button(root,text="6",width=5,command=lambda:show("6")).grid(row=3,column=2)
Button(root,text="-",width=5,command=lambda:show("-")).grid(row=3,column=3)


Button(root,text="1",width=5,command=lambda:show("1")).grid(row=4,column=0)
Button(root,text="2",width=5,command=lambda:show("2")).grid(row=4,column=1)
Button(root,text="3",width=5,command=lambda:show("3")).grid(row=4,column=2)
Button(root,text="+",width=5,command=lambda:show("+")).grid(row=4,column=3)



Button(root,text="0",width=12,
       command=lambda:show("0")).grid(row=5,column=0,columnspan=2)
Button(root,text=".",width=5,
       command=lambda:show(".")).grid(row=5,column=2)
Button(root,text="=",width=5,bg="yellow",
       command=lambda:calculate()).grid(row=5,column=3)

root.mainloop()       


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM