前言
Tkinter 是 Python 标准的 GUI 工具包包含在Python标准安装包中,所以无需再另外安装。我个人觉得使用 Tkinter 创建 GUI 界面相比于 PyQt 来说代码更加简洁,不过看个人爱好吧,只要熟悉这些 GUI 工具包过后使用起来都不算难,关键是找到自己更喜欢的一种。
正文
首先通过创建一个简单的应用来逐步说明 Tkinter 的用法,示例来源于《Python 基础教程》。该应该是一个简单的文本编辑器,可以打开文件然后进行编辑,最后保存文件。
先来看看 UI 界面:
源代码:
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()) as file:
file.write(contents.get('1.0',END))
top = Tk()
top.title("Simple Editor")
contents = ScrolledText()
contents.pack(side = BOTTOM,expand = True,fill = BOTH)
filename = Entry()
filename.pack(side = LEFT,expand = True,fill = X)
Button(text = "Open",command = load).pack(side = LEFT)
Button(text = "Save",command = save).pack(side = LEFT)
mainloop()
代码解读
首先,要使用 Tkinter,就得先导入模块吧,这里将模块所有内容都导入了:
from tkinter import *
此外,编辑文本内容,需要用到一个编辑框,这里使用ScrolledText,该控件其实就是对应 Qt 里面的 QTextEdit,是同样的东西,只是叫法不同罢了。所以这里再导入该控件:
from tkinter.scrolledtext import ScrolledText
要创建 GUI,需要先创建一个将充当主窗口的顶级控件,为此,需要实例化一个 Tk 对象。如下:
top = Tk()
接着,可以给该创建设置一个标题:
top.title("Simple Editor")
创建完顶层窗口后,我们将调用 函数mainloop()以进入 Tkinter 主事件循环中。这就和 Qt 里面的 app.exec() 一样一样儿的。
紧接着创建ScrolledText对象,这是一个文本编辑控件,然后 pack 是一个布局管理器,用于调整控件的位置,必须要使用布局管理器,要不然控件将不可见。
pack 中的参数,side表示停靠的方位,相对于主窗口的位置,可设置成 LEFT、RIGHT、TOP 或 BOTTOM,expand表示是否填满分配给它的空间,fill表示要哪个坐标,可以是 X 或者 Y,BOTH 表示 x 和 Y 均填充满父窗口。
Entry()是一个输入框,用于输入需要打开的文件名,该控件对应 Qt 里面的 QLineEdit。
最后是两个按钮的创建,这里是直接使用控件的构造函数来配置控件。
如果分解开来可以这样写:
btn = Button()
btn['text'] = "Open"
btn.pack(side = LEFT)
btn['command'] = load
注意这里的 command 属性,这是添加按钮点击的行为,点击按钮时会调用 load 函数。
也可以不用分别给属性赋值,而使用方法 config 同时设置多个属性,如下:
btn.config(text = 'Open',command = load)
最后再来看看两个函数。
首先是 load 函数,这是用于打开文件的,通过 with open 来打开文件,将文件内容读取出来显示到文本框中。
contents.delete(‘1.0’,END) 是用于清空文本框中的内容,这里的1.0用来指定第一行和第0个字符(即第一个字符前面),使用 END 来指定文本末尾。
清空之后开始插入文本:contents.insert(INSERT,file.read()),file.read()是将文件中的所有内容读取出来。
同样 save() 函数就是用于保存文本框中的内容到文件中去,这里就不细说了。
ok,该界面很简单,基本就这些内容,如果要快速了解 pack 可用的属性,可以直接在命令行输入:help(Pack.config)进行查看。
事件处理
通过上面的示例知道,可以通过属性 command 给按钮置顶动作,这是一种特殊的事件处理,但 Tkinter 还提供了更通用的事件处理机制:方法 bind,要让控件对特定的事件进行处理,可对其调用方法 bind,并指定时间的名称和要使用的函数。示例如下:
from tkinter import *
top = Tk()
def callback(event):
print(event.x,event.y)
top.bind('<Button-1>',callback)
mainloop()
其中是使用鼠标左按钮单击的事件名称,将事件关联到 callback 函数,当用户在窗口中单击时,将调用这个函数,向函数传递一个 event 对象,这个对象包含的属性随事件类型而异。将鼠标点击的坐标位置打印出来。
还有很多其他类型的事件,完整的清单可以使用下面的命令来获取:help(Tk.bind)
本文只是简单的介绍了 Tkinter 的使用,更多的用法还要通过帮助文档来进行深入了解。