我的代码结构如下: -
def send_message(msg):
print msg + "\n"
x.new_message("You",msg)
class GUI(Frame):
def createWidgets(self):
self.input.bind('<Key-Return>',self.send)
def send(self, event):
send_message(self.contents.get())
self.contents.set("")
def new_message(self,sender, msg):
line = sender+": "+msg+"\n"
self.chat.contents.set(self.chat.contents.get()+line)
def __init__(self):
self.createWidgets()
x = GUI()
正如您所看到的,这有一些循环的依赖性。函数send_message需要实例x以及GUI的new_message方法。 GUI定义需要send_message。因此,不可能满足所有约束。怎么办?
答案 0 :(得分:0)
在函数定义时,Python函数中的名称不需要引用任何内容 - 只有在实际调用函数时才会查找它们。所以,你的send_message()
完全没问题(尽管将x
作为参数而不是全局变量可能会更好。)
您的GUI
类将无法实例化,如图所示,因为您没有显示创建的小部件 - 例如self.input
。我不知道这有多少是由于您剥离了代码以便发布。
答案 1 :(得分:0)
在您在评论中显示的完整代码中,我们可以看到您在self.mainloop()
中呼叫GUI.__init__
。这将启动gui的事件处理,并且可能不会在程序完成之前终止。只有这样,作业x = GUI()
才会完成,x
将可用。
为了避免这种情况,您有多种选择。通常在__init__
中进行无限循环可能是一个坏主意。而是在实例化GUI之后调用mainloop()
。
def __init__(self):
# only do init
x = GUI()
x.mainloop()
正如jasonharper所说,函数中的python变量只能在执行该函数时查找,而不是在定义函数时查找。因此,运行时中的循环依赖关系大多数时候都不是python中的问题。