【问题标题】:Python Tkinter: can a slider widget control another slider widgetPython Tkinter:一个滑块小部件可以控制另一个滑块小部件吗
【发布时间】:2021-11-11 23:31:40
【问题描述】:

我有一个控制器滑块,它有 10 个位置,它加载一组不同的值来设置它的三个子滑块。我使用回调通过widget.set(value) 命令加载和设置每个小部件。我还保留了对小部件变量的引用,我也使用该值独立设置了该变量。

问题是我可以验证值是否正确加载和设置,无论是在小部件本身还是在变量引用中,但目标小部件的句柄不会凸出

我知道这是可行的,我以前做过,只是找不到代码。我认为这只是将小部件设置为值的问题。但显然不是这样,因为我不能在这里做。我试过只设置小部件,只设置它的变量引用,我什至尝试过配置选项widget.config(variable = value)。所有正确设置小部件。我是否缺少让目标小部件的句柄反映值并设置在正确位置的技巧?

【问题讨论】:

  • 这是不可能的,它是应用程序的一部分,并且有太多的依赖关系,只是一个代码位无法工作,但是,在尝试生成一个更简单的工作示例时,.set() 命令实际工作并有效地设置了 subslider 的句柄。这让我更深入地研究了我的代码,发现一个指向引用的指针是错误的,但没有引发任何异常,也没有影响应用程序的整体状态......

标签: python user-interface tkinter widget slider


【解决方案1】:

如果有人偶然发现了这个问题:我已经为我的问题构建了一个可重现的最小示例,结果证明是这样实现的,该函数运行良好。第二个滑块什么都不做,第一个滑块设置第二个

import tkinter as tk
from tkinter import ttk

class Gui(tk.Tk):
    def __init__(self, parent=None):

        tk.Tk.__init__(self, parent)

        self.var1 = tk.IntVar(name = "var1")
        self.var2 = tk.DoubleVar(name="var2")
        self.panel = ttk.Frame()

        # The master slider callback
        def selectorAfter(event):
            v = [1.02, 30.4, 51.0, 65.5, 81.17, 11.11, 50.00, 0.0]
            # Either setting slider or variable will work
            self.var2.set(v[int(event)])
            ## self.slider2.set(v[int(event)])
            print(event)

        # The sub slider callback    
        def sliderAfter(event):
            print(event)

        self.slider1 = tk.Scale(self.panel, name = "slider1", variable= self.var1, from_= 0, to= 7, length=330, width=10, orient='horizontal', command = selectorAfter)
        self.slider2 = tk.Scale(self.panel, name = "slider2", variable= self.var2, from_= 0.0, to= 100.0, length=330, width=10, orient='horizontal', command = sliderAfter)

    # def body(self):
        self.panel.grid(row=0, column=0, sticky="w")
        self.slider1.grid(row=1, column=0, sticky="w")
        self.slider2.grid(row=2, column=0, sticky="w")


if __name__ == "__main__":
    app = Gui(None)
    app.title('Example')
    app.mainloop()

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多