【发布时间】:2017-11-09 11:24:59
【问题描述】:
Ttk 版本中还存在几个 Tk 小部件。通常它们具有相同的一般行为,但使用“样式”和“主题”而不是每个实例的外观属性(例如bg 等...)。这很好,因为 Ttk 小部件默认采用操作系统窗口管理器的“标准外观”,而无需配置任何外观。
但是,由于某种原因,ttk.Scale 小部件没有 tk.Scale 小部件的两个非常有用的选项:showvalue 和 tickinterval(请参阅 reference)。这很奇怪,因为它们更多的是关于行为而不是关于外观。
在保持ttk 外观的同时“模仿”这两个选项会很棒。
以下代码是我对此的笨拙尝试。问题是:有没有更好的方法? (显然,除了将整个东西封装在一个类中)以及如何合理地获得一个半自动化的tickinterval 替代品(而不是像下面的代码那样“手动”完成)。
import tkinter as tk
import tkinter.ttk as ttk
# initial setup
root = tk.Tk()
frame = tk.Frame(root)
#################################################################
# create a tk slider showing current value and ticks
# (showvalue=True is the default)
tkslider = tk.Scale(frame, from_=-4, to=4,
orient=tk.HORIZONTAL, tickinterval=2)
#################################################################
#################################################################
# create a ttk slider showing current value and ticks
# use a ttk frame to get ttk style background
ttkslider = ttk.Frame(frame)
# define a callback function to update the value label
def ttk_slider_callback(value):
# 'value' seems to be a string - bug or feature?
value_label.config(text=round(float(value)))
# 'text' can apparently be an int and gets converted into str
# (...) possibly do other stuff
# decompose frame into two ttk labels and a ttk scale
value_label = ttk.Label(ttkslider, text=0)
actual_slider = ttk.Scale(ttkslider, from_=-4, to=4,
command=ttk_slider_callback)
# (orient=tk.HORIZONTAL is the default)
ticks_label = ttk.Label(ttkslider, text=' -4 -2 0 2 4 ')
# put it all together
value_label.grid()
actual_slider.grid()
ticks_label.grid()
#################################################################
# final setup
tkslider.grid(row=0, column=0)
ttkslider.grid(row=0, column=1)
frame.grid()
root.mainloop()
前面代码的结果,在实际“滑动”Scales 之前,可能看起来像这样,左边是 Tk Scale,右边是 Ttk Scale(每个操作系统/窗口管理器会明显不同):
【问题讨论】:
-
一些想法:1) 对于您的
showvalue实现,您可以对Scale和Label小部件使用单个StringVar。不幸的是ttk.Scale缺少digits选项,该选项控制值的字符串表示。无论如何,在我看来,现在还可以。 2)tickinterval的实现更加棘手:您可以尝试生成所有“tick”值(因为您知道所需的tickinterval)、标签和coords(通过tk调用root.tk.call(actual_slider, 'coords', str(round(float(value)))))并将这些标签相对放置到Scale。 -
@CommonSense 1) 我实际上曾尝试在发布之前使用
StringVar进行小部件间通信,但遗憾的是它导致显示带有大量数字的浮点数,这实际上弄乱了标签位置也是如此 - 因此数字的“手动”四舍五入以获得更整洁的显示。 2)感谢您的链接,它可能很有用
标签: python python-3.x tkinter ttk