Hal*_*z0r 5 python tkinter slider tkinter-scale
是否可以有一个滑块(Scaletkinter中的小部件),其中操纵滑块时显示的可能值是从列表中读取的离散值?
我列表中的值不是偶数步,而是取决于情况。
从我看到的所有示例中,您可以指定一个最小值,一个最大值和一个阶跃值(一次为n个值),但是我的列表可能如下所示:
list=['0', '2000', '6400', '9200', '12100', '15060', '15080']
Run Code Online (Sandbox Code Playgroud)
举个例子。重申一下,我希望它在拉动滑块时从例如list [0]到list [1]或list [6]到list [5]。
如果有人有其他建议可以轻松地从列表中的数百个项目中选择一个值,那么我无所不能。我尝试了该OptionMenu小部件,但是它变得广泛而难以理解。
编辑您可以将滑块的命令设置为回调,让该回调将当前值与您的列表进行比较,然后通过调用滑块上的set()跳到最近的值
所以:
slider = Slider(parent, from_=0, to=100000, command=callback)
Run Code Online (Sandbox Code Playgroud)
和:
def callback(event):
current = event.widget.get()
#compare value here and select nearest
event.widget.set(newvalue)
Run Code Online (Sandbox Code Playgroud)
编辑:显示一个完整的(但简单的示例)
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()
Run Code Online (Sandbox Code Playgroud)
我已经在python 2.7.6和3.3.2中对此进行了测试,即使拖动滑块,它也会跳到最接近鼠标当前位置的值,而不是只有放开滑块时才跳。