[关闭]
@yanglt7 2018-11-16T12:12:00.000000Z 字数 4431 阅读 1297

Tkinter02_LabelFrame & Entry

Tkinter


LabelFrame 组件

LabelFrame 组件是 Frame 框架的进化版,从形态上说,也就是添加了 Label 的 Frame,但有了它,Checkbutton 和 Radiobutton 的组件分组就变得简单了。

例 7

  1. from tkinter import *
  2. root = Tk()
  3. group = LabelFrame(root, text="最好的脚本语言是?", padx=5, pady=5)
  4. group.pack(padx=10, pady=10)
  5. LANGS = [
  6. ("Python", 1),
  7. ("Perl", 2),
  8. ("Ruby", 3),
  9. ("Lua", 4)]
  10. v = IntVar()
  11. for lang, num in LANGS:
  12. b = Radiobutton(group, text=lang, variable=v, value=num)
  13. b.pack(anchor=W)
  14. mainloop()

此处输入图片的描述

Entry 组件

Entry 组件即输入框。输入框是跟程序交互的一个途径。

例 8

  1. from tkinter import *
  2. root = Tk()
  3. e = Entry(root)
  4. e.pack(padx=10, pady=10)
  5. e.delete(0, END)
  6. e.insert(0, "默认文本...")
  7. # 删除和插入内容
  8. mainloop()

此处输入图片的描述

例 9 添加一个按钮,当单击按钮的时候,获取输入框的内容并打印出来,然后清空输入框

  1. from tkinter import *
  2. root = Tk()
  3. # Tkinter 总共提供了三种布局组件的方法:pack(), grid(), place()
  4. # grid() 方法允许使用表格的形式来管理组件的位置
  5. # row 选项代表行,column 选项代表列
  6. Label(root, text="作品:").grid(row=0, column=0) # column=0 可不写,其为默认值
  7. Label(root, text="作者:").grid(row=1)
  8. e1 = Entry(root)
  9. e2 = Entry(root)
  10. e1.grid(row=0, column=1, padx=10, pady=5)
  11. e2.grid(row=1, column=1, padx=10, pady=5)
  12. def show():
  13. print("作品:《%s》" % e1.get())
  14. print("作者:%s" % e2.get())
  15. # 如果表格大于组件,则可以使用 sticky 选项来设置组件的位置
  16. Button(root, text="获取信息", width=10, command=show)\
  17. .grid(row=2, column=0, sticky=W, padx=10,pady=5)
  18. Button(root, text="退出", width=10, command=root.quit)\
  19. .grid(row=2, column=1, sticky=E, padx=10, pady=5)
  20. mainloop()

此处输入图片的描述

例 10 设计一个密码输入框,即使用星号(¥)代替用户输入的内容,只需要设置 show 选项即可。

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

此处输入图片的描述

另外,Entry 组件还支持验证输入内容的合法性。例如输入框要求输入的是数字,用户输入了字母那就属于“非法”。实现该功能,需要通过设置 validate、validatecommand 和 invalidcommand 三个选项。

首先启用验证的“开关”是 validate 选项,该选项可设置的值如表所示:

含义
'focus' 当 Entry 组件获得或失去焦点的时候验证
'focusin' 当 Entry 组件获得焦点的时候验证
'focusout' 当 Entry 组件失去焦点的时候验证
'key' 当输入框被编辑的时候验证
'all' 当出现上面任何一种情况的时候验证
'none' 关闭验证功能。默认设置该选项(即不启用验证)。注意,是字符串的'none',而非 None

其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。

例 11 在第一个输入框输入“小甲鱼”并通过 Tab 键将焦点转移到第二个输入框的时候,验证功能被成功触发。

  1. from tkinter import *
  2. master = Tk()
  3. def test():
  4. if e1.get() == "小甲鱼":
  5. print("正确!")
  6. return True
  7. else:
  8. print("错误!")
  9. e1.delete(0, END)
  10. return False
  11. v = StringVar()
  12. e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=test)
  13. e2 = Entry(master)
  14. e1.pack(padx=10, pady=10)
  15. e2.pack(padx=10, pady=10)
  16. mainloop()

此处输入图片的描述

最后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。

  1. def test2():
  2. print("我被调用了......")
  3. return True
  4. e1 = Entry(master, textvariable=v, validate="focusout", \
  5. validatecommand=test1, invalidcommand=test2)

此处输入图片的描述

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

此处输入图片的描述

可以这样使用:

validatecommand = (f, s1, s2, ...)

其中,f 是验证函数名,s1, s2 是额外的选项,这些选项会作为参数依次传给 f 函数。在此之前,需要调用 register() 方法将验证函数包装起来。

例 12

  1. from tkinter import *
  2. master = Tk()
  3. v = StringVar()
  4. def test(content, reason, name):
  5. if content == "小甲鱼":
  6. print("正确!")
  7. print(content, reason, name)
  8. return True
  9. else:
  10. print("错误!")
  11. print(content, reason, name)
  12. return False
  13. testCMD = master.register(test)
  14. e1 = Entry(master, textvariable=v, validate="focusout", \
  15. validatecommand=(testCMD, '%P', '%v', '%W'))
  16. e2 = Entry(master)
  17. e1.pack(padx=10, pady=10)
  18. e2.pack(padx=10, pady=10)
  19. mainloop()

此处输入图片的描述

例 13 实现一个简单的计算器

  1. from tkinter import *
  2. master = Tk()
  3. frame = Frame(master)
  4. frame.pack(padx=10, pady=10)
  5. v1 = StringVar()
  6. v2 = StringVar()
  7. v3 = StringVar()
  8. def test(content):
  9. # 注意,这里不能使用 e1.get() 或者 v1.get() 来获取输入的内容
  10. # 因为 validate 选项指定为 "key" 的时候,有任何输入操作都会被拦截到这个函数中
  11. # 也就是说先拦截,只有这个函数返回 True,那么输入的内容才会到变量里边
  12. # 所以要用 %P 来获取最新的输入框内容
  13. if content.isdigit():
  14. return True
  15. else:
  16. return False
  17. testCMD = master.register(test)
  18. Entry(frame, width=10, textvariable=v1, validate="key", \
  19. validatecommand=(testCMD, '%P')).grid(row=0, column=0)
  20. Label(frame, text="+").grid(row=0, column=1)
  21. Entry(frame, width=10, textvariable=v2, validate="key", \
  22. validatecommand=(testCMD, '%P')).grid(row=0, column=2)
  23. Label(frame, text="=").grid(row=0, column=3)
  24. Entry(frame, width=10, textvariable=v3, state="readonly")\
  25. .grid(row=0, column=4)
  26. def calc():
  27. result = int(v1.get()) + int(v2.get())
  28. v3.set(str(result))
  29. Button(frame, text="计算结果", command=calc)\
  30. .grid(row=1, column=2, pady=5)
  31. mainloop()

此处输入图片的描述

摘自《零基础入门学习Python》

参考链接:

An Introduction To Tkinter
Tkinter汇总
Python GUI编程(Tkinter)
Tkinter颜色方案举例
python tkinter可以使用的颜色
tkinter学习-菜单与画布
程序设计思想与方法--第五章
用Python中的tkinter模块作图

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注