我对Python和Tkinter还不熟悉,所以不知道哪种方法最简单。有人可以检查下面的代码,告诉我如何跟踪在子类中定义的radiobutton返回的值并将其传递给父类。编译后出现以下错误:
AttributeError: Toplevel instance has no attribute 'trace_fun'
我不知道为什么会出现这个错误,因为我已经在子类body中定义了trace_fun
。我已经成功地跟踪了父类中的变量,但是在试图在子类中进行跟踪时却遇到了上述错误。在
from Tkinter import *
class Parent(Frame):
classvar = 0
def __init__(self):
Frame.__init__(self)
self.master.title("Parent WIndow")
self.master.geometry("200x100")
self.grid()
self._button = Button(self, text="Create", width=10, command=self.new_window)
self._button.grid(row=0, column=0, sticky=E+W)
def new_window(self):
self.new = Child()
class Child(Parent, Frame):
def __init__(self):
Parent.__init__(self)
new = Frame.__init__(self)
new = Toplevel(self)
new.title("Child Window")
new.grid()
new._var = IntVar()
new._var.set(0)
new._var.trace("w", new.trace_fun)
new._radioButton = Radiobutton(new, text = "Option 1", variable = new._var, value = 1)
new._radioButton.grid(row=0, column=0, sticky=W, padx=10, pady=10)
new._radioButton2 = Radiobutton(new, text = "Option 2", variable = new._var, value = 2)
new._radioButton2.grid(row=1, column=0, sticky=W, padx=10, pady=10)
new._button = Button(new, text = 'Ok', command=new.destroy)
new._button.grid(row=2, column=0, pady=10)
def trace_fun(new, *args):
print new._var.get()
Parent.classvar = new._var.get()
obj = Parent()
def main():
obj.mainloop()
main()
通过稍作修改,现在我的代码可以完美地工作了。发布新代码的人陷入同一点,我早些时候。可以在下面的代码中看到更改:
您在此处重写了
new
变量:在这两个语句执行之后,
new
等于顶级类的一个实例。在接下来,此代码将执行:
^{pr2}$尤其是:
因此,您有一个顶级实例尝试访问名为trace_fun的属性。错误消息告诉您顶级类没有任何名为trace_fun的属性。在
编辑:
你永远不能在顶级实例上调用trace_fun。也不能在父实例上调用trace_fun。所以打印一份你的程序,然后拿一支笔圈出所有顶层实例的变量,然后圈出所有作为父实例的变量。你不能对这些变量调用trace_fun。或者,圈出作为子实例的所有变量。你可以在这些变量上调用trace_fun。在
下面是一个您可以做什么的示例:
看起来在两个帧之间没有父/子关系,因为子帧不使用从父帧继承的任何内容。所以你可以为你的应用程序创建两个单独的框架。下面是一个例子:
相关问题 更多 >
编程相关推荐