前言
tkinter为Python自带的GUI模块,具有简洁、轻便、跨品台等特性,能满足小型应用程序GUI的快速构建。但其自身文档资源匮乏,Python文档中对tkinter的介绍更是草草了事。
还有千言万语。。。。。
第一部分:tkinter基础
1.1 tkinter是什么?
tkinter模块(“TK接口”)是Python标准的 Tk GUI 工具包接口,也是Python默认的GUI库 。Tk 和tkinter能运行在包括Windows、Linux、Mac等绝大多数计算机平台上。Tk8.0以及后续版本实现了本地窗口风格,应用程序风格更加和谐。tkinter是基于TK工具包的,后者最初是为工具命令语言Tcl设计的,后来被移植到许多脚本语言中,包括Perl。借助Tk开发GUI的可移植性和灵活性,再加上Python的简洁和灵活性,使用tkinter可以快速开发适用于各种平台的GUI应用程序。
tkinter由大量的模块组成,TK接口是通过一个二进制的扩展模块“_tkinter”实现的,该模块由底层的TK接口组成,不能直接调用,大多数情况是通过共享库或DLL形式使用,但有些时候可以与Python编译器静态链接。
在Python中,Tk接口由大量的Python模块组成,最重要的模块是“tkinter”。使用之前,首先需要导入该模块:
import tkinter
或则,更常用的导入形式:
from tkinter import *
使用以上方法,仅仅将tkinter中的控件类和相关的常数导入程序中,不会对程序造成影响,可以安全使用from-in
形式,不过应用import-as
形式,则更加简洁,具体为:
import tkinter as tk
使用Python2编写程序时,需要将“tkinter”首字母大写,比如:
import Tkinter as tk
。
1.2 Hello,tkniter!
闲话少说,按照大多数编程语言书籍的习惯,此处以“Hello,tkinter!”示例开始。
# hello_tkinter.py
from tkinter import *
root = Tk()
w = Label(root,text = 'Hello,tkinter!')
w.pack()
root.mainloop()
使用Python3执行该段代码:
python3 hello_tkinter.py
不出意外的话,会出现如下界面。
上述代码在Windows10环境下运行的效果,窗口风格完全本地化。首先,通过
from tkinter import *
导入tkinter模块,包括界面编写需要类、函数等。为了初始化tkinter,必须在其他控件之前创建1个Tk根控件(第1行),一般是程序的主窗口(或根窗口)。1个应用程序只能有1个Tk根控件。
程序第2、3行用来生成1个Label控件,作为根控件的子项。Label控件既能显示文字也可以显示图标,上述示例是通过Label控件的text选项显示“Hello,tkinter!”文字。接下来,通过Label控件的pack方法将Label控件的大小与显示的文字匹配,并使之显示出来。最后,通过root.mainloop()
进入事件循环就可以看到应用程序窗口。
在关闭之前,程序会一直处于事件循环中。事件循环(mainloop)不仅响应用户的需求,而且同时处理tkinter自身的队列任务,这些任务中有窗口几何管理(通过Pack方法)和显示更新。所以,在程序进入事件循环之前,应用程序窗口是不会显示的。
通过上述示例可知:每个Tk GUI程序必须有1个根控件(或主窗口),是整个程序的基础,包含了所有其他控件。所以,当我们说需要创建1个根控件(或主窗口)时,实际上是需要1个放置其他所有控件的窗口。Tk根控件是由tkinter中的TK类创建的,具体由tkinter.TK()实现。
1.3 Hello,again!
使用Python编写大型应用程序经常将代码写在1个或若干类(class)里,比如:
# hello_again.py
from tkinter import *
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.button = Button(frame,text = "QUIT", fg="red", command = frame.quit)
self.button.pack(side = LEFT)
self.hi_there = Button(frame, text = "Hello",command = self.say_hi)
self.hi_there.pack()
def say_hi(self):
print("hi there, everyone!")
root = Tk()
app = App(root)
root.mainloop()
运行以上代码会出现下图所示窗口。鼠标单击“Hello”,在终端打印“hi there, everyone!”,单击“QUIT”,退出。