【发布时间】: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