@yanglt7
2018-11-16T12:12:00.000000Z
字数 4431
阅读 1389
Tkinter
LabelFrame 组件是 Frame 框架的进化版,从形态上说,也就是添加了 Label 的 Frame,但有了它,Checkbutton 和 Radiobutton 的组件分组就变得简单了。
例 7
from tkinter import *root = Tk()group = LabelFrame(root, text="最好的脚本语言是?", padx=5, pady=5)group.pack(padx=10, pady=10)LANGS = [("Python", 1),("Perl", 2),("Ruby", 3),("Lua", 4)]v = IntVar()for lang, num in LANGS:b = Radiobutton(group, text=lang, variable=v, value=num)b.pack(anchor=W)mainloop()

Entry 组件即输入框。输入框是跟程序交互的一个途径。
例 8
from tkinter import *root = Tk()e = Entry(root)e.pack(padx=10, pady=10)e.delete(0, END)e.insert(0, "默认文本...")# 删除和插入内容mainloop()

例 9 添加一个按钮,当单击按钮的时候,获取输入框的内容并打印出来,然后清空输入框
from tkinter import *root = Tk()# Tkinter 总共提供了三种布局组件的方法:pack(), grid(), place()# grid() 方法允许使用表格的形式来管理组件的位置# row 选项代表行,column 选项代表列Label(root, text="作品:").grid(row=0, column=0) # column=0 可不写,其为默认值Label(root, text="作者:").grid(row=1)e1 = Entry(root)e2 = Entry(root)e1.grid(row=0, column=1, padx=10, pady=5)e2.grid(row=1, column=1, padx=10, pady=5)def show():print("作品:《%s》" % e1.get())print("作者:%s" % e2.get())# 如果表格大于组件,则可以使用 sticky 选项来设置组件的位置Button(root, text="获取信息", width=10, command=show)\.grid(row=2, column=0, sticky=W, padx=10,pady=5)Button(root, text="退出", width=10, command=root.quit)\.grid(row=2, column=1, sticky=E, padx=10, pady=5)mainloop()

例 10 设计一个密码输入框,即使用星号(¥)代替用户输入的内容,只需要设置 show 选项即可。
from tkinter import *root = Tk()Label(root, text="账号:").grid(row=0, column=0)Label(root, text="密码:").grid(row=1, column=0)# 获取输入框里边的内容,可以使用 Entry 组件的 get() 方法。# 也可以将一个 Tkinter 的变量(通常是 StringVar)挂钩到 textvariable 选项,然后通过变量的 get() 方法获取。v1 = StringVar()v2 = StringVar()e1 = Entry(root, textvariable=v1)e2 = Entry(root, textvariable=v2, show="¥") # 符号任意设置,如 * & 等等e1.grid(row=0, column=1, padx=10, pady=5)e2.grid(row=1, column=1, padx=10, pady=5)def show():print("账号:%s" % e1.get())print("密码:%s" % e2.get())Button(root, text="芝麻开门", width=10, command=show)\.grid(row=2, column=0, sticky=W, padx=10,pady=5)Button(root, text="退出", width=10, command=root.quit)\.grid(row=2, column=1, sticky=E, padx=10, pady=5)mainloop()

另外,Entry 组件还支持验证输入内容的合法性。例如输入框要求输入的是数字,用户输入了字母那就属于“非法”。实现该功能,需要通过设置 validate、validatecommand 和 invalidcommand 三个选项。
首先启用验证的“开关”是 validate 选项,该选项可设置的值如表所示:
| 值 | 含义 |
|---|---|
| 'focus' | 当 Entry 组件获得或失去焦点的时候验证 |
| 'focusin' | 当 Entry 组件获得焦点的时候验证 |
| 'focusout' | 当 Entry 组件失去焦点的时候验证 |
| 'key' | 当输入框被编辑的时候验证 |
| 'all' | 当出现上面任何一种情况的时候验证 |
| 'none' | 关闭验证功能。默认设置该选项(即不启用验证)。注意,是字符串的'none',而非 None |
其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。
例 11 在第一个输入框输入“小甲鱼”并通过 Tab 键将焦点转移到第二个输入框的时候,验证功能被成功触发。
from tkinter import *master = Tk()def test():if e1.get() == "小甲鱼":print("正确!")return Trueelse:print("错误!")e1.delete(0, END)return Falsev = StringVar()e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=test)e2 = Entry(master)e1.pack(padx=10, pady=10)e2.pack(padx=10, pady=10)mainloop()

最后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。
def test2():print("我被调用了......")return Truee1 = Entry(master, textvariable=v, validate="focusout", \validatecommand=test1, invalidcommand=test2)

其实,Tkinter 为验证函数提供一些额外的选项,如下表:

可以这样使用:
validatecommand = (f, s1, s2, ...)
其中,f 是验证函数名,s1, s2 是额外的选项,这些选项会作为参数依次传给 f 函数。在此之前,需要调用 register() 方法将验证函数包装起来。
例 12
from tkinter import *master = Tk()v = StringVar()def test(content, reason, name):if content == "小甲鱼":print("正确!")print(content, reason, name)return Trueelse:print("错误!")print(content, reason, name)return FalsetestCMD = master.register(test)e1 = Entry(master, textvariable=v, validate="focusout", \validatecommand=(testCMD, '%P', '%v', '%W'))e2 = Entry(master)e1.pack(padx=10, pady=10)e2.pack(padx=10, pady=10)mainloop()

例 13 实现一个简单的计算器
from tkinter import *master = Tk()frame = Frame(master)frame.pack(padx=10, pady=10)v1 = StringVar()v2 = StringVar()v3 = StringVar()def test(content):# 注意,这里不能使用 e1.get() 或者 v1.get() 来获取输入的内容# 因为 validate 选项指定为 "key" 的时候,有任何输入操作都会被拦截到这个函数中# 也就是说先拦截,只有这个函数返回 True,那么输入的内容才会到变量里边# 所以要用 %P 来获取最新的输入框内容if content.isdigit():return Trueelse:return FalsetestCMD = master.register(test)Entry(frame, width=10, textvariable=v1, validate="key", \validatecommand=(testCMD, '%P')).grid(row=0, column=0)Label(frame, text="+").grid(row=0, column=1)Entry(frame, width=10, textvariable=v2, validate="key", \validatecommand=(testCMD, '%P')).grid(row=0, column=2)Label(frame, text="=").grid(row=0, column=3)Entry(frame, width=10, textvariable=v3, state="readonly")\.grid(row=0, column=4)def calc():result = int(v1.get()) + int(v2.get())v3.set(str(result))Button(frame, text="计算结果", command=calc)\.grid(row=1, column=2, pady=5)mainloop()

摘自《零基础入门学习Python》
参考链接:
An Introduction To Tkinter
Tkinter汇总
Python GUI编程(Tkinter)
Tkinter颜色方案举例
python tkinter可以使用的颜色
tkinter学习-菜单与画布
程序设计思想与方法--第五章
用Python中的tkinter模块作图