【问题标题】:Python3: Tkinter and buggy scalesPython3:Tkinter 和越野车秤
【发布时间】:2017-01-14 03:36:33
【问题描述】:

对于我正在处理的项目,我需要创建一种方法让用户指定一个数字范围,但要使该范围有意义(即最小值不高于最大值),为此我创建了“双滑块”,其中一个的值会影响另一个的范围(反之亦然)。

这很好用(下面的代码)但是当我有两组双滑块时我会遇到一些奇怪的行为(为了简洁起见,我们将这些组称为 X 和 Y),例如当我将 XLower 的值提高到 10 以上并放手时将减少到 10,而且 2 个较低的滑块似乎也相互交互。

双滑块的代码:

        self.varHPLower = tk.IntVar()
        self.varHPLower = 0
        self.varHPUpper = tk.IntVar()
        self.varHPUpper = 250
        self.sclHPLower = tk.Scale(self, command=self.updatedHPLowerScale, variable=self.varHPLower, from_=self.varHPLower, to=self.varHPUpper, orient=tk.HORIZONTAL, resolution=10, bg='#ffef82', width=10)
        self.sclHPLower.place(x=100, y=320, width=570, height=40)
        self.sclHPLower.set(self.varHPLower)
        self.sclHPUpper = tk.Scale(self, command=self.updatedHPUpperScale, variable=self.varHPUpper, from_=self.varHPLower, to=self.varHPUpper, orient=tk.HORIZONTAL, resolution=10, bg='#ffef82', width=10)
        self.sclHPUpper.place(x=100, y=360, width=570, height=40)
        self.sclHPUpper.set(self.varHPUpper)

        self.lblHPLowerLeftLabel = tk.Label(self, text=str(self.varHPLower), anchor='w', bg='#ffef82')
        self.lblHPLowerLeftLabel.place(x=75, y=330, width=25, height=20)
        self.lblHPLowerRightLabel = tk.Label(self, text=str(self.varHPUpper), anchor='w', bg='#ffef82')
        self.lblHPLowerRightLabel.place(x=670, y=330, width=25, height=20)
        self.lblHPUpperLeftLabel = tk.Label(self, text=str(self.varHPLower), anchor='w', bg='#ffef82')
        self.lblHPUpperLeftLabel.place(x=75, y=370, width=25, height=20)
        self.lblHPUpperRightLabel = tk.Label(self, text=str(self.varHPUpper), anchor='w', bg='#ffef82')
        self.lblHPUpperRightLabel.place(x=670, y=370, width=25, height=20)
        self.lblHPRange = tk.Label(self, text='', bg='#ffef82', font=('Lucida Grande',12))
        self.lblHPRange.place(x=350, y=285, width=200, height=30)

        self.varRetreatCostLower = tk.IntVar()
        self.varRetreatCostLower = 0
        self.varRetreatCostUpper = tk.IntVar()
        self.varRetreatCostUpper = 5
        self.sclRetreatCostLower = tk.Scale(self, command=self.updatedRetreatCostLowerScale, variable=self.varRetreatCostLower, from_=self.varRetreatCostLower, to=self.varRetreatCostUpper, orient=tk.HORIZONTAL, bg='#ffef82', width=10)
        self.sclRetreatCostLower.place(x=730, y=370, width=570, height=40)
        self.sclRetreatCostLower.set(self.varRetreatCostLower)
        self.sclRetreatCostUpper = tk.Scale(self, command=self.updatedRetreatCostUpperScale, variable=self.varRetreatCostUpper, from_=self.varRetreatCostLower, to=self.varRetreatCostUpper, orient=tk.HORIZONTAL, bg='#ffef82', width=10)
        self.sclRetreatCostUpper.place(x=730, y=410, width=570, height=40)
        self.sclRetreatCostUpper.set(self.varRetreatCostUpper)

        self.lblRetreatCostLowerLeftLabel = tk.Label(self, text=str(self.varRetreatCostLower), anchor='w', bg='#ffef82')
        self.lblRetreatCostLowerLeftLabel.place(x=705, y=380, width=25, height=20)
        self.lblRetreatCostLowerRightLabel = tk.Label(self, text=str(self.varRetreatCostUpper), anchor='w', bg='#ffef82')
        self.lblRetreatCostLowerRightLabel.place(x=1300, y=380, width=25, height=20)
        self.lblRetreatCostUpperLeftLabel = tk.Label(self, text=str(self.varRetreatCostLower), anchor='w', bg='#ffef82')
        self.lblRetreatCostUpperLeftLabel.place(x=705, y=420, width=25, height=20)
        self.lblRetreatCostUpperRightLabel = tk.Label(self, text=str(self.varRetreatCostUpper), anchor='w', bg='#ffef82')
        self.lblRetreatCostUpperRightLabel.place(x=1300, y=420, width=25, height=20)
        self.lblRetreatCostRange = tk.Label(self, text='', bg='#ffef82',font=('Lucida Grande',12))
        self.lblRetreatCostRange.place(x=980, y=335, width=200, height=30)

def updatedHPLowerScale(self,* args,** kwargs):
    self.sclHPUpper.config(from_=self.sclHPLower.get())
    self.lblHPUpperLeftLabel.config(text=str(self.sclHPLower.get()))
    self.updateHPRangeLabel()

def updatedHPUpperScale(self,* args,** kwargs):
    self.sclHPLower.config(to=self.sclHPUpper.get())
    self.lblHPLowerRightLabel.config(text=str(self.sclHPUpper.get()))
    self.updateHPRangeLabel()

def updateHPRangeLabel(self):
    if self.sclHPLower.get() == self.sclHPUpper.get():
        self.lblHPRange.config(text='HP Range: {}'.format(self.sclHPUpper.get()))
    else:
        self.lblHPRange.config(text='HP Range: {} to {}'.format(self.sclHPLower.get(), self.sclHPUpper.get()))

def updatedRetreatCostLowerScale(self,* args,** kwargs):
    self.sclRetreatCostUpper.config(from_=self.sclRetreatCostLower.get())
    self.lblRetreatCostUpperLeftLabel.config(text=str(self.sclRetreatCostLower.get()))
    self.updateRetreatCostRangeLabel()

def updatedRetreatCostUpperScale(self,* args,** kwargs):
    self.sclRetreatCostLower.config(to=self.sclRetreatCostUpper.get())
    self.lblRetreatCostLowerRightLabel.config(text=str(self.sclRetreatCostUpper.get()))
    self.updateRetreatCostRangeLabel()

def updateRetreatCostRangeLabel(self):
    if self.sclRetreatCostLower.get() == self.sclRetreatCostUpper.get():
        self.lblRetreatCostRange.config(text='RetreatCost Range: {}'.format(self.sclRetreatCostUpper.get()))
    else:
        self.lblRetreatCostRange.config(text='RetreatCost Range: {} to {}'.format(self.sclRetreatCostLower.get(), self.sclRetreatCostUpper.get()))

正如我所说,其中有两个(每个都有自己的方法),我可能只是错过了一个错误命名的变量,但如果您能帮助追踪错误的来源,我将不胜感激!

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:
        self.varHPLower = tk.IntVar()
        self.varHPLower = 0
    

    因此,您将丢弃您创建的 IntVar,将它们替换为整数 - 作为 Slider 的 variable= 选项无效。您必须使用 IntVars 的 .get().set() 方法来操作它们的存储值。

    【讨论】:

    • 谢谢!我不知道!
    • 刚刚试了一下,还把from_=self.varHPLower的实例替换为from_=self.varHPLower.get()等,就可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2018-05-08
    相关资源
    最近更新 更多