原文: http://zetcode.com/tkinter/widgets/

在 Tkinter 教程的这一部分中,我们将介绍一些基本的 Tkinter 小部件。 我们使用以下小部件:CheckbuttonLabelScaleListbox

小部件是 GUI 应用的基本构建块。 多年以来,几个小部件已成为所有 OS 平台上所有工具包中的标准。 例如按钮,复选框或滚动条。 其中一些名称可能不同。 例如,在 Tkinter 中,复选框称为复选框。 Tkinter 具有一小组可满足基本编程需求的小部件。 可以将更多专门的窗口小部件创建为自定义窗口小部件。

Tkinter Checkbutton

Checkbutton是具有两种状态的窗口小部件:打开和关闭。 接通状态通过复选标记显示。 (某些主题可能具有不同的视觉效果。)它用来表示某些布尔属性。 Checkbutton小部件提供一个带有文本标签的复选框。

check_button.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. This program toggles the title of the
  5. window with the Checkbutton widget.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, Frame, Checkbutton
  11. from tkinter import BooleanVar, BOTH
  12. class Example(Frame):
  13. def __init__(self):
  14. super().__init__()
  15. self.initUI()
  16. def initUI(self):
  17. self.master.title("Checkbutton")
  18. self.pack(fill=BOTH, expand=True)
  19. self.var = BooleanVar()
  20. cb = Checkbutton(self, text="Show title",
  21. variable=self.var, command=self.onClick)
  22. cb.select()
  23. cb.place(x=50, y=50)
  24. def onClick(self):
  25. if self.var.get() == True:
  26. self.master.title("Checkbutton")
  27. else:
  28. self.master.title("")
  29. def main():
  30. root = Tk()
  31. root.geometry("250x150+300+300")
  32. app = Example()
  33. root.mainloop()
  34. if __name__ == '__main__':
  35. main()

在我们的示例中,我们在窗口上放置了一个检查按钮。 复选按钮显示或隐藏窗口的标题。

  1. self.var = BooleanVar()

我们创建一个BooleanVar对象。 它是 Tkinter 中小部件的布尔值的值持有者。

  1. cb = Checkbutton(self, text="Show title",
  2. variable=self.var, command=self.onClick)

创建Checkbutton的实例。 值持有者通过variable参数连接到窗口小部件。 当我们单击检查按钮时,将调用onClick()方法。 这是通过command参数完成的。

  1. cb.select()

最初,标题显示在标题栏中。 因此,一开始,我们使用select()方法对其进行了检查。

  1. if self.var.get() == True:
  2. self.master.title("Checkbutton")
  3. else:
  4. self.master.title("")

onClick()方法内部,我们根据self.var变量中的值显示或隐藏标题。

Tkinter 小部件 - 图1

图:Checkbutton

Tkinter 标签

Label小部件用于显示文本或图像。 没有用户交互。

label.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this script, we use the Label
  5. widget to show an image.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from PIL import Image, ImageTk
  11. from tkinter import Tk
  12. from tkinter.ttk import Frame, Label
  13. import sys
  14. class Example(Frame):
  15. def __init__(self):
  16. super().__init__()
  17. self.loadImage()
  18. self.initUI()
  19. def loadImage(self):
  20. try:
  21. self.img = Image.open("tatras.jpg")
  22. except IOError:
  23. print("Unable to load image")
  24. sys.exit(1)
  25. def initUI(self):
  26. self.master.title("Label")
  27. tatras = ImageTk.PhotoImage(self.img)
  28. label = Label(self, image=tatras)
  29. # reference must be stored
  30. label.image = tatras
  31. label.pack()
  32. self.pack()
  33. def setGeometry(self):
  34. w, h = self.img.size
  35. self.master.geometry(("%dx%d+300+300") % (w, h))
  36. def main():
  37. root = Tk()
  38. ex = Example()
  39. ex.setGeometry()
  40. root.mainloop()
  41. if __name__ == '__main__':
  42. main()

我们的示例在窗口上显示图像。

  1. from PIL import Image, ImageTk

默认情况下,Label小部件只能显示一组有限的图像类型。 要显示 JPG 图像,我们必须使用 PIL,Python Imaging Library 模块。 通过 Pillow 教程了解有关 PIL 的更多信息。

  1. self.img = Image.open("tatras.jpg")

我们从当前工作目录中的图像文件创建一个Image

  1. tatras = ImageTk.PhotoImage(self.img)

我们根据图像创建照片图像。

  1. label = Label(self, image=tatras)

将照片图像提供给标签窗口小部件的image参数。

  1. label.image = tatras

为了不被垃圾收集,必须存储图像引用。

  1. w, h = self.img.size
  2. self.master.geometry(("%dx%d+300+300") % (w, h))

我们使窗口的大小完全适合图像的大小。

Tkinter 刻度

Scale是一个小部件,可让用户通过在有限间隔内滑动旋钮以图形方式选择一个值。 我们的示例将在标签小部件中显示一个选定的数字。

scale.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this script, we show how to
  5. use the Scale widget.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, BOTH, IntVar, LEFT
  11. from tkinter.ttk import Frame, Label, Scale, Style
  12. class Example(Frame):
  13. def __init__(self):
  14. super().__init__()
  15. self.initUI()
  16. def initUI(self):
  17. self.master.title("Scale")
  18. self.style = Style()
  19. self.style.theme_use("default")
  20. self.pack(fill=BOTH, expand=1)
  21. scale = Scale(self, from_=0, to=100,
  22. command=self.onScale)
  23. scale.pack(side=LEFT, padx=15)
  24. self.var = IntVar()
  25. self.label = Label(self, text=0, textvariable=self.var)
  26. self.label.pack(side=LEFT)
  27. def onScale(self, val):
  28. v = int(float(val))
  29. self.var.set(v)
  30. def main():
  31. root = Tk()
  32. ex = Example()
  33. root.geometry("250x100+300+300")
  34. root.mainloop()
  35. if __name__ == '__main__':
  36. main()

上面的脚本中有两个小部件:标尺和标签。 标签控件中显示了比例控件的值。

  1. scale = Scale(self, from_=0, to=100,
  2. command=self.onScale)

Scale小部件已创建。 我们提供上下限。 from是常规的 Python 关键字,这就是为什么第一个参数后会有下划线的原因。 当我们移动秤的旋钮时,将调用onScale()方法。

  1. self.var = IntVar()
  2. self.label = Label(self, text=0, textvariable=self.var)

创建一个整数值持有者和标签小部件。 持有者的值显示在标签小部件中。

  1. def onScale(self, val):
  2. v = int(float(val))
  3. self.var.set(v)

onScale()方法从缩放窗口小部件接收当前选择的值作为参数。 该值首先转换为浮点数,然后转换为整数。 最后,将值设置为标签窗口小部件的值持有者。

Tkinter 小部件 - 图2

图:Scale

Tkinter 列表框

Listbox是显示对象列表的窗口小部件。 它允许用户选择一项或多项。

listbox.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this script, we show how to
  5. use the Listbox widget.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, BOTH, Listbox, StringVar, END
  11. from tkinter.ttk import Frame, Label
  12. class Example(Frame):
  13. def __init__(self):
  14. super().__init__()
  15. self.initUI()
  16. def initUI(self):
  17. self.master.title("Listbox")
  18. self.pack(fill=BOTH, expand=1)
  19. acts = ['Scarlett Johansson', 'Rachel Weiss',
  20. 'Natalie Portman', 'Jessica Alba']
  21. lb = Listbox(self)
  22. for i in acts:
  23. lb.insert(END, i)
  24. lb.bind("<<ListboxSelect>>", self.onSelect)
  25. lb.pack(pady=15)
  26. self.var = StringVar()
  27. self.label = Label(self, text=0, textvariable=self.var)
  28. self.label.pack()
  29. def onSelect(self, val):
  30. sender = val.widget
  31. idx = sender.curselection()
  32. value = sender.get(idx)
  33. self.var.set(value)
  34. def main():
  35. root = Tk()
  36. ex = Example()
  37. root.geometry("300x250+300+300")
  38. root.mainloop()
  39. if __name__ == '__main__':
  40. main()

在我们的示例中,我们显示了Listbox中的女演员列表。 当前选择的女演员显示在标签小部件中。

  1. acts = ['Scarlett Johansson', 'Rachel Weiss',
  2. 'Natalie Portman', 'Jessica Alba']

这是要在列表框中显示的女演员列表。

  1. lb = Listbox(self)
  2. for i in acts:
  3. lb.insert(END, i)

我们创建Listbox的实例,并插入上述列表中的所有项目。

  1. lb.bind("<<ListboxSelect>>", self.onSelect)

当我们在列表框中选择一个项目时,将生成<<ListboxSelect>>事件。 我们将onSelect()方法绑定到此事件。

  1. self.var = StringVar()
  2. self.label = Label(self, text=0, textvariable=self.var)

将创建标签及其值持有者。 在此标签中,我们将显示当前选择的项目。

  1. sender = val.widget

我们得到了事件的发送者。 这是我们的列表框小部件。

  1. idx = sender.curselection()

我们使用curselection()方法找出所选项目的索引。

  1. value = sender.get(idx)

使用get()方法检索实际值,该方法获取项目的索引。

  1. self.var.set(value)

最后,标签被更新。

Tkinter 小部件 - 图3

图:Listbox小部件

在 Tkinter 教程的这一部分中,我们介绍了几个 Tkinter 小部件。