如何使用tkinter滑块“Scale”小部件进行离散步骤操作?

8

有没有可能创建一个滑块控件(tkinter中的Scale小部件),当操作滑块时显示的可能值是从列表中读取的离散值?

我的列表中的值不是均匀分布的,而是与情况相关的。

从我看到的所有示例中,你可以指定最小值、最大值和步长(每次n个值),但我的列表可能是这样的:

list=['0', '2000', '6400', '9200', '12100', '15060', '15080']

举个例子,我希望在拉动滑块的时候能够从例如list[0]到list[1]或者从list[6]到list[5],重申一遍,我的意思是想要这样的效果。

如果有人对于如何轻松地从列表中挑选出数百个项目有任何其他建议,我非常乐意听取。我尝试过OptionMenu小部件,但它变得太复杂了,难以查看。

1个回答

8

您可以将滑块的命令设置为一个回调函数,该回调函数将当前值与列表进行比较,然后通过在滑块上调用set()来跳转到最近的值。

因此:

slider = Slider(parent, from_=0, to=100000, command=callback)

并且:

def callback(event):
    current = event.widget.get()
    #compare value here and select nearest
    event.widget.set(newvalue)

编辑: 展示一个完整(但简单)的例子。
try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

valuelist = [0,10,30,60,100,150,210,270]

def valuecheck(value):
    newvalue = min(valuelist, key=lambda x:abs(x-float(value)))
    slider.set(newvalue)

root = tk.Tk()

slider = tk.Scale(root, from_=min(valuelist), to=max(valuelist), command=valuecheck, orient="horizontal")

slider.pack()

root.mainloop()

我已经在Python 2.7.6和3.3.2中进行了测试,即使拖动滑块,它也会跳到鼠标当前位置最近的值,而不仅仅是在松开滑块时才跳。


谢谢您的建议,但我在实施时遇到了问题。 - Halldinz0r
我已经添加了一个完整的示例,以展示它应该如何工作,并让您尝试它。 - James Kent
这是一个天才的解决方案。我简直不敢相信我自己想不出来。 - Ogen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接