Python Tkinter Scale和LabeledScale用法

Scale 组件代表一个滑动条,可以为该滑动条设置最小值和最大值,也可以设置滑动条每次调节的步长。 Scale 组件支持如下选项:

  • from:设置该 Scale 的最小值。
  • to:设置该 Scale 的最大值。
  • resolution:设置该 Scale 滑动时的步长。
  • label:为 Scale 组件设置标签内容。
  • length:设置轨道的长度。
  • width:设置轨道的宽度。
  • troughcolor:设置轨道的背景色。
  • sliderlength:设置轨道的长度。
  • sliderrelief:设置滑块的立体样式。
  • showvalue:设置是否显示当前值。
  • orient:设置方向。该选项支持 VERTICAL 和 HORIZONTAL 两个值。
  • digits:设置有效数字至少要有几位。
  • variable:用于与变量进行绑定。
  • command:用于为该 Scale 组件绑定事件处理,函数或方法。

如果使用 ttk.Scale 组件,则更接近操作系统本地的效果,但允许定制的选项少。 下面以一个示例程序来介绍 Scale 组件的选项的功能和用法:

  1. from tkinter import *
  2. # 导入ttk
  3. from tkinter import ttk
  4.  
  5. class App:
  6. def __init__(self, master):
  7. self.master = master
  8. self.initWidgets()
  9. def initWidgets(self):
  10. self.scale = Scale(self.master,
  11. from_ = -100, # 设置最大值
  12. to = 100, # 设置最小值
  13. resolution = 5, # 设置步长
  14. label = '示范Sacle', # 设置标签内容
  15. length = 400, # 设置轨道的长度
  16. width = 30, # 设置轨道的宽度
  17. troughcolor='lightblue', # 设置轨道的背景色
  18. sliderlength=20, # 设置滑块的长度
  19. sliderrelief=SUNKEN, # 设置滑块的立体样式
  20. showvalue=YES, # 设置显示当前值
  21. orient = HORIZONTAL #设置水平方向
  22. )
  23. self.scale.pack()
  24. # 创建一个Frame作为容器
  25. f = Frame(self.master)
  26. f.pack(fill=X, expand=YES, padx=10)
  27. Label(f, text='是否显示值:').pack(side=LEFT)
  28. i = 0
  29. self.showVar = IntVar()
  30. self.showVar.set(1)
  31. # 创建两个Radiobutton控制Scale是否显示值
  32. for s in ('不显示', '显示'):
  33. Radiobutton(f, text=s, value=i,variable=self.showVar,
  34. command=self.switch_show).pack(side=LEFT)
  35. i += 1
  36. # 创建一个Frame作为容器
  37. f = Frame(self.master)
  38. f.pack(fill=X, expand=YES, padx=10)
  39. Label(f, text='方向:').pack(side=LEFT)
  40. i = 0
  41. self.orientVar = IntVar()
  42. self.orientVar.set(0)
  43. # 创建两个Radiobutton控制Scale的方向
  44. for s in ('水平', '垂直'):
  45. Radiobutton(f, text=s, value=i,variable=self.orientVar,
  46. command=self.switch_orient).pack(side=LEFT)
  47. i += 1
  48. def switch_show(self):
  49. self.scale['showvalue'] = self.showVar.get()
  50. def switch_orient(self):
  51. # 根据单选框的选择设置orient选项的值
  52. self.scale['orient'] = VERTICAL if self.orientVar.get() else HORIZONTAL
  53. root = Tk()
  54. root.title("Scale测试")
  55. App(root)
  56. root.mainloop()

上面程序创建了 Scale 组件,并为该 Scale 组件指定了前面所介绍的选项。此外,程序还根据单选钮的选中状态来设置 Scale 组件的 showvalue 选项,该选项将会控制该 Scale 组件是否显示当前值。此程序会根据单选钮的选中状态设置 Scale 是水平的还是垂直的(根据 orient 选项进行设置)。 运行上面程序,如果将 Scale 组件默认显示为水平滑动条,则效果如图 1 所示。 Scale水平滑动条 图 1 水平滑动条 如果将上面的 Scale 设置为垂直渭动条,并选中“不显示”单选钮,将会看到如图 2 所示的效果。 Scale垂直滑动条 图 2 垂直滑动条 Scale 组件同样支持 variable 进行变量绑定,也支持使用 command 选项绑定事件处理函数或方法,这样每当用户拖动滑动条上的滑块时,都会触发 command 绑定的事件处理方法,不过 Scale 的事件处理方法比较奇葩,它可以额外定义一个参数,用于获取 Scale 的当前值。例如如下程序:

  1. from tkinter import *
  2. # 导入ttk
  3. from tkinter import ttk
  4.  
  5. class App:
  6. def __init__(self, master):
  7. self.master = master
  8. self.initWidgets()
  9. def initWidgets(self):
  10. # 定义变量
  11. self.doubleVar = DoubleVar()
  12. self.scale = Scale(self.master,
  13. from_ = -100, # 设置最大值
  14. to = 100, # 设置最小值
  15. resolution = 5, # 设置步长
  16. label = '示范Sacle', # 设置标签内容
  17. length = 400, # 设置轨道的长度
  18. width = 30, # 设置轨道的宽度
  19. orient = HORIZONTAL, #设置水平方向
  20. digits = 10, # 设置十位有效数字
  21. command = self.change, # 绑定事件处理函数
  22. variable = self.doubleVar # 绑定变量
  23. )
  24. self.scale.pack()
  25. # 设置Scale的当前值
  26. self.scale.set(20)
  27. # 这个事件处理函数比较奇葩,它可以接收到Scale的值
  28. def change(self, value):
  29. print(value, self.scale.get(), self.doubleVar.get())
  30. root = Tk()
  31. root.title("Scale测试")
  32. App(root)
  33. root.mainloop()

上面程序示范了通过三种方式来获取 Scale 组件的值:

  • 通过事件处理方法的参数来获取。
  • 通过 Scale 组件提供的 get() 方法来获取。
  • 通过 Scale 组件绑定的变量来获取。 通过上面三种方式获取的变量值都是一样的,但由于 Scale 组件指定了 digits 选项(该选项指定 Scale 的值的有效数字至少保留几位)为 10,因此程序通过事件处理方法获取的值将有 10 位有效数字,如 -35.0000000。 ttk.LabeledScale 是平台化的滑动条,因此它允许设置的选项很少,只能设置 from、to 和 compound 等有限的几个选项,而且它总是生成一个水平滑动条(不能变成垂直的),其中 compound 选项控制滑动条的数值标签是显示在滑动条的上方,还是滑动条的下方。 下面程序示范了 LabeledScale 组件的功能和用法:
  1. from tkinter import *
  2. # 导入ttk
  3. from tkinter import ttk
  4.  
  5. class App:
  6. def __init__(self, master):
  7. self.master = master
  8. self.initWidgets()
  9. def initWidgets(self):
  10. self.scale = ttk.LabeledScale(self.master,
  11. from_ = -100, # 设置最大值
  12. to = 100, # 设置最小值
  13. # compound = BOTTOM # 设置显示数值的Label在下方
  14. )
  15. self.scale.value = -20
  16. self.scale.pack(fill=X, expand=YES)
  17. root = Tk()
  18. root.title("LabeledScale测试")
  19. App(root)
  20. root.mainloop()

上面程序创建了一个 LabeledScale 组件,该组件会生成一个水平滑动条,并且滑动条的数值标签默认会显示在滑动条的上方;如果取消程序中被注释代码的注释,也就是将 compound 选项设为 BOTTOM,则意味着滑动条的数值标签默认会显示在滑动条的下方。