@yanglt7
2018-11-16T12:12:00.000000Z
字数 4431
阅读 1297
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 True
else:
print("错误!")
e1.delete(0, END)
return False
v = 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 True
e1 = 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 True
else:
print("错误!")
print(content, reason, name)
return False
testCMD = 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 True
else:
return False
testCMD = 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模块作图