对于我的程序,我希望在它旁边有一个水平比例和一个可以改变彼此值的旋转框。例如,如果两者都从1到100并且我将Scale拖动到50,我希望旋转框中的数字也改为50,反之亦然。这是我的尝试:
class Main_window(ttk.Frame):
"""A program"""
def __init__(self, master):
ttk.Frame.__init__(self, master)
self.grid()
self.create_widgets()
def create_widgets(self):
"""Creates all the objects in the window"""
self.scale = ttk.Scale(self, orient = HORIZONTAL, length = 200,
from_ = 1.0, to = 100.0,
command = self.update,
).grid(row = 3,
column = 1,
sticky = W)
spinval = StringVar()
self.spinbox = Spinbox(self, from_ = 1.0, to = 100.0,
textvariable = spinval,
command = self.update,
width = 10).grid(row = 3,
column =3,
sticky = W)
def update(self):
"""Changes the spinbox and the scale according to each other"""
self.scale.set(self.spinbox.get())
self.spinbox.delete(0.0,END)
self.spinbox.insert(0.0,self.scale.get())
def main():
"""Loops the window"""
root = Tk()
root.title("window")
root.geometry("400x300")
app = Main_window(root)
root.mainloop()
main()
首先,当我移动缩放滑块时,我收到错误: TypeError:update()需要1个位置参数但是2个被赋予
第二,当我改变spinbox的值时,我得到: AttributeError:'NoneType'对象没有属性'set'
我不知道这是否是正确的方法。欢迎任何帮助。
答案 0 :(得分:3)
错误 AttributeError:'NoneType'对象没有属性'set'是因为你试图使用对象属性来存储对小部件的引用,但实际上你存储的结果是对grid
的调用,始终为无。将它分成两个不同的语句来解决这个问题:
self.scale = ttk.Scale(self, ...)
self.scale.grid(...)
# Same for self.spinbox
如果您希望两个小部件具有相同的值,那么最好的选择是使用相同的Tkinter变量:
spinval = StringVar()
self.scale = ttk.Scale(self, variable=spinval, ...)
# ...
self.spinbox = Spinbox(self, textvariable = spinval, ...)
如果对两个小部件使用相同的command
选项,则问题在于它们向函数传递了不同数量的参数,并且当您为其他小部件设置新值时,它将触发{再次{1}},所以它最终会在对此函数的无限循环调用中结束。