spinbox和Scale在Tkinter中改变彼此的值

时间:2013-06-07 00:53:01

标签: python widget tkinter

对于我的程序,我希望在它旁边有一个水平比例和一个可以改变彼此值的旋转框。例如,如果两者都从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'

我不知道这是否是正确的方法。欢迎任何帮助。

1 个答案:

答案 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}},所以它最终会在对此函数的无限循环调用中结束。