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()