【问题标题】:How to use tkinter slider `Scale` widget with discrete steps?如何使用具有离散步骤的 tkinter 滑块“Scale”小部件?
【发布时间】:2015-10-09 13:42:04
【问题描述】:

是否可以有一个滑块(tkinter 中的Scale 小部件),其中在操作滑块时显示的可能值是从列表中读取的离散值?

我列表中的值不是均匀步长,并且取决于情况。

从我看到的所有示例中,您可以指定最小值、最大值和步长值(一次 n 个值),但我的列表可能如下所示:

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

仅作为示例。重申一下,我希望它在拉动滑块时从列表 [0] 到列表 [1] 或从列表 [6] 到列表 [5]。

如果有人对能够从列表中的数百个项目中轻松选择一个值有任何其他建议,我会全力以赴。我尝试了OptionMenu 小部件,但它变得广泛而难以查看。

【问题讨论】:

    标签: python tkinter slider tkinter-scale


    【解决方案1】:

    编辑您可以将滑块的命令设置为回调,让该回调将当前值与您的列表进行比较,然后通过调用滑块上的 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 中对此进行了测试,即使在拖动滑块时,它也会跳转到与鼠标当前位置最近的值,而不是仅在您松开滑块时才跳转。

    【讨论】:

    • 感谢您的建议,虽然我在实施时遇到了问题
    • 我已经添加了一个完整的示例来向您展示它应该如何工作并让您尝试一下
    • 这是一个天才的解决方案。我不敢相信我想不出它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多