Python Tkinter Scale和LabeledScale用法

广告位

Scale 组件代表一个滑动条,可以为该滑动条设置最小值和最大值,也可以设置滑动条每次调节的步长。 Scale…

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 组件的选项的功能和用法:

  from tkinter import *  # 导入ttk  from tkinter import ttk    class App:      def __init__(self, master):          self.master = master          self.initWidgets()      def initWidgets(self):          self.scale = Scale(self.master,              from_ = -100,  # 设置最大值              to = 100,  # 设置最小值              resolution = 5, # 设置步长              label = '示范Sacle', # 设置标签内容              length = 400, # 设置轨道的长度              width = 30, # 设置轨道的宽度              troughcolor='lightblue', # 设置轨道的背景色              sliderlength=20, # 设置滑块的长度              sliderrelief=SUNKEN, # 设置滑块的立体样式              showvalue=YES, # 设置显示当前值              orient = HORIZONTAL  #设置水平方向          )          self.scale.pack()          # 创建一个Frame作为容器          f = Frame(self.master)          f.pack(fill=X, expand=YES, padx=10)          Label(f, text='是否显示值:').pack(side=LEFT)          i = 0          self.showVar = IntVar()          self.showVar.set(1)          # 创建两个Radiobutton控制Scale是否显示值          for s in ('不显示', '显示'):              Radiobutton(f, text=s, value=i,variable=self.showVar,              command=self.switch_show).pack(side=LEFT)              i += 1          # 创建一个Frame作为容器          f = Frame(self.master)          f.pack(fill=X, expand=YES, padx=10)          Label(f, text='方向:').pack(side=LEFT)          i = 0          self.orientVar = IntVar()          self.orientVar.set(0)          # 创建两个Radiobutton控制Scale的方向          for s in ('水平', '垂直'):              Radiobutton(f, text=s, value=i,variable=self.orientVar,              command=self.switch_orient).pack(side=LEFT)              i += 1      def switch_show(self):          self.scale['showvalue'] = self.showVar.get()      def switch_orient(self):          # 根据单选框的选择设置orient选项的值          self.scale['orient'] = VERTICAL if self.orientVar.get() else HORIZONTAL  root = Tk()  root.title("Scale测试")  App(root)  root.mainloop()

上面程序创建了 Scale 组件,并为该 Scale 组件指定了前面所介绍的选项。此外,程序还根据单选钮的选中状态来设置 Scale 组件的 showvalue 选项,该选项将会控制该 Scale 组件是否显示当前值。此程序会根据单选钮的选中状态设置 Scale 是水平的还是垂直的(根据 orient 选项进行设置)。

运行上面程序,如果将 Scale 组件默认显示为水平滑动条,则效果如图 1 所示。

Python Tkinter Scale和LabeledScale用法
图 1 水平滑动条

如果将上面的 Scale 设置为垂直渭动条,并选中“不显示”单选钮,将会看到如图 2 所示的效果。

Python Tkinter Scale和LabeledScale用法
图 2 垂直滑动条

Scale 组件同样支持 variable 进行变量绑定,也支持使用 command 选项绑定事件处理函数或方法,这样每当用户拖动滑动条上的滑块时,都会触发 command 绑定的事件处理方法,不过 Scale 的事件处理方法比较奇葩,它可以额外定义一个参数,用于获取 Scale 的当前值。例如如下程序:

  from tkinter import *  # 导入ttk  from tkinter import ttk    class App:      def __init__(self, master):          self.master = master          self.initWidgets()      def initWidgets(self):          # 定义变量          self.doubleVar = DoubleVar()          self.scale = Scale(self.master,              from_ = -100,  # 设置最大值              to = 100,  # 设置最小值              resolution = 5, # 设置步长              label = '示范Sacle', # 设置标签内容              length = 400, # 设置轨道的长度              width = 30, # 设置轨道的宽度              orient = HORIZONTAL,  #设置水平方向              digits = 10, # 设置十位有效数字              command = self.change, # 绑定事件处理函数              variable = self.doubleVar # 绑定变量          )          self.scale.pack()          # 设置Scale的当前值          self.scale.set(20)      # 这个事件处理函数比较奇葩,它可以接收到Scale的值      def change(self, value):          print(value, self.scale.get(), self.doubleVar.get())  root = Tk()  root.title("Scale测试")  App(root)  root.mainloop()

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

  1. 通过事件处理方法的参数来获取。
  2. 通过 Scale 组件提供的 get() 方法来获取。
  3. 通过 Scale 组件绑定的变量来获取。

通过上面三种方式获取的变量值都是一样的,但由于 Scale 组件指定了 digits 选项(该选项指定 Scale 的值的有效数字至少保留几位)为 10,因此程序通过事件处理方法获取的值将有 10 位有效数字,如 -35.0000000。

ttk.LabeledScale 是平台化的滑动条,因此它允许设置的选项很少,只能设置 from、to 和 compound 等有限的几个选项,而且它总是生成一个水平滑动条(不能变成垂直的),其中 compound 选项控制滑动条的数值标签是显示在滑动条的上方,还是滑动条的下方。

下面程序示范了 LabeledScale 组件的功能和用法:

  from tkinter import *  # 导入ttk  from tkinter import ttk    class App:      def __init__(self, master):          self.master = master          self.initWidgets()      def initWidgets(self):          self.scale = ttk.LabeledScale(self.master,              from_ = -100,  # 设置最大值              to = 100,  # 设置最小值  #            compound = BOTTOM # 设置显示数值的Label在下方          )          self.scale.value = -20          self.scale.pack(fill=X, expand=YES)  root = Tk()  root.title("LabeledScale测试")  App(root)  root.mainloop()

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

关于作者: Python基础入门教程

为您推荐

广告位

发表评论