译自Modern Tkinter for Busy Python Developers
与pyQt,wxPython相比tkinter较为简单,我用来制作小型GUI程序,省去了很多较为深入的知识,只保留了常用部分。
Widgets
Widget 类
Widget是对象,表示Button, frame等类的实例。
窗口的分层结构
另一件需要知道的事是创造的widget实例的父级。Tk中,所有的widgets都是窗口分层结构中的一部分,单个root作为分层结构的顶部。这个结构可以有任意深度,你可以在一个root窗口中建一个frame,frame包含另一个frame,frame又包含一个button。甚至一个新的顶级窗口是同样结构中的一部分,它的内容组成整体窗口分层结构中的子树。
在常见例子中,我有单个frame作为root窗口的孩子,这个frame控制着其他所有孩子。root窗口是frame是容器,及父级。
创建和使用Widgets
每个分开的widget都是python的一个对象。当创建一个widget时,必须将它的父级作为参数传入widget的生成函数。唯一的例外是root窗口,它作为顶级窗口包含了其他的任何东西。它被自动创建,没有父级。例如:
1 2 3 |
root = Tk() content = ttk.Frame(root) button = ttk.Button(content) |
是否要将widget对象存入一个变量取决于使用者,并且决定于过后时候要引用它。
配置选项
所有的widget都有很多不同的配置选项,这将会控制它们的显示和行为。
可用的选项取决于widget的类。不同widget类之间有很大的一致性,所以一样的选项有着一样的名称。button和label都有一个text
选项去调整widget会显示的文本内容,同时scrollbar不需要一个text
选项因为它不需要。同样的,button有一个command
选项去告知被按下时将要做什么,label用于储存静态文本,就没有command
。
配置选项在widget第一次被创建时可以设定,通过传递选项名称和选项值作为参数。
1 |
button = ttk.Button(root,text="hello",command="buttonpressed") |
事后可以检查选项的值是多少,并且除个别例外以外,可以随时修改它们。
1 2 |
button["text"] button["text"] = "goodbye" |
如果不确定一个widget全部的不同选项,可以访问widget来列出它们。可以看见选项的名称和当前的值。
1 2 |
button.congigure("text") button.congigure() |
图形化管理
创建完widget以后,会发现它们并没有显示在屏幕上,这是另外的一步操作。
定位通过grid
命令完成。我们传入column和row来让widget在grid内对齐。Grid是图形化管理的一个例子。(Tk中有多个,但是grid最常用。)我们将在后面的章节中详细讲grid。
事件处理
Tk中,这里有一个事件循环体在接受着操作系统的事件。比如按钮被按下,键盘点击,鼠标移动,窗口缩放等等。
事件绑定
可以通过bind
去捕捉事件,然后执行某一部分代码。
这里有一个比较傻的例子。
1 2 3 4 5 6 7 8 9 10 11 |
from tkinter import * from tkinter import ttk root = Tk() l = ttk.Label(root,text="Starting...") l.grid() l.bind("<Enter>",lambda e:l.configure(text="Moved mouse inside")) l.bind("<Leave>",lambda e:l.configure(text="Moved mouse outside")) l.bind("<1>",lambda e:l.configure(text="Clicked left mouse botton")) l.bind("<Double-1>",lambda e:l.configure(text="Double Clicked")) l.bind("<B3-Motion>",lambda e:l.configure(text="right button drag to %d,%d" %(e.x,e.y))) root.mainloop() |
前三个事件都很直接。双击的绑定引入了事件修饰符的概念。
这个链接有更详细的信息。