第十二章 图形用户界面
12.1 创建 GUI 示例应用程序
编写一个简 单的程序,让用户能够编辑文本文件
这个微型文本编辑器的需求如下。
1、 让用户能够打开指定的文本文件。
2、 让用户能够编辑文本文件。
3、 让用户能够保存文本文件。
4、让用户能够退出。
编写GUI程序时,绘制其用户界面草图通常很有帮助。图12-1显示了一个可满足前述文本编 辑器需求的简单布局。
这些界面元素的用法如下。 在按钮左边的文本框中输入文件名,再单击Open按钮打开这个文件,它包含的文本将出 现在底部的文本框中。 在底部的大型文本框中,你可随心所欲地编辑文本。 要保存所做的修改,可单击Save按钮,这将把大型文本框的内容写入到顶部文本框指定 的文件中。 没有Quit(退出)按钮,用户只能使用默认Tkinter菜单中的Quit命令来退出程序。
12.1.1 初探
首先,必须导入tkinter。为保留其命名空间,同时减少输入量,可能需要将其重命名。
import tkinter as tk
要创建GUI,可创建一个将充当主窗口的顶级组件(控件)。为此,可实例化一个Tk对象。
import tkinter as tk
top=tk.Tk()
top.mainloop() #调用函数mainloop以进入Tkinter主事件循环
此时将出现一个窗口如下:。
图12-2
添加按钮:
btn=tk.Button(top)
现在这个按钮是不可见的——你需要使用布局管理器(也叫几何体管理器)来告诉Tkinter 将它放在什么地方。
图12-3
控件包含各种属性,我们可以使用它们来修改控件的外观和行为。
btn['text']="点击我"
图12-4
给按钮添加行为也非常简单。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
import tkinter as tk
top = tk.Tk() #创建主窗口
top.title("第一个窗口") #主窗口标题
top.geometry('500x200') #设置主窗口大小
lab = tk.Label(top, text='') #添加标签
lab.pack()
btn = tk.Button(top) #添加按钮
btn.pack()
btn['text'] = "这是按钮" #给btn按钮text属性赋值
def click(): #定义事件函数
lab['text'] = "那是谁呀,按了按钮就没下文了?"
btn['command'] = click #给btn按钮绑定事件
top.mainloop()
图12-4
12.1.2 布局
对控件调用方法pack时,将把控件放在其父控件(主控件)中。主窗口本身是一个Toplevel,也可以在主窗口外添加额外的窗口,可以把不同功能的控件分到不同窗口上,也可以用来当弹窗使用。像其它button、label这类的小控件,在创建时总需要传入一个窗口。
second = tk.Toplevel(top)
图12-6
给副窗口添加属性,并包含一个标签。
second = tk.Toplevel(top)
second.title("副窗口")
sublab=tk.Label(second )
sublab.pack()
sublab['text']="这是一个在副窗口中的标签。"
图12-7
(可能由于版本的不同,书中的一些代码不能实现,所以只能这样了。有些参数设定可以参见nkd50000 的博客小白学tkinter(常用参数大总结)。
12.1.3 事件处理
可通过设置属性command给按钮指定动作(action)。这是一种特殊的事件处理,但 Tkinter还提供了更通用的事件处理机制:方法bind。要让控件对特定的事件进行处理,可对其调 用方法bind,并指定事件的名称和要使用的函数。下面是一个示例:
import tkinter as tk
top = tk.Tk() #创建一个窗口
def callback(event): #定义事件
print(event.x, event.y) #获取鼠标左键点击的坐标,打印输出。
top.bind('<Button-1>', callback) #绑定事件,<Button-1>是使用鼠标左按钮(按钮1)单击的事件名称。
top.mainloop()
事件的完整的清单可使用下面的命令来获取:
import tkinter as tk
help(tk.Tk.bind)
12.1.4 最终的程序
from tkinter import *
from tkinter.scrolledtext import ScrolledText
def load():
with open(filename.get()) as file:
contents.delete('1.0', END)
contents.insert(INSERT, file.read())
def save():
with open(filename.get(), 'w') as file:
file.write(contents.get('1.0', END))
top = Tk()
top.title("简单文本编辑器")
contents = ScrolledText()
contents.pack(side=BOTTOM, expand=True, fill=BOTH)
filename = Entry()
filename.pack(side=LEFT, expand=True, fill=X)
Button(text='打开', command=load).pack(side=LEFT)
Button(text='保存', command=save).pack(side=LEFT)
mainloop()
图12-8
保存之后,会产生一个你好文件:
图12-9
12.2 使用其他 GUI 工具包
python除内置的TkinterGUI包之外,还有很多的第三方GUI供选择,但每个包的功能虽然大同小异,其使用时的函数、参数及函数调用方法不尽相同,因此初学PythonGUI一要选对包,二要看参考手册甚至源代码等资料,三要勤奋。