我正在使用异步TCP服务器。
一切进展顺利,我从中学到了很多,但是我有一个与结构有关的问题。
这是结构的外观:
Server对象是在自己的线程中运行的异步TCP服务器。 它通过线程安全队列与GUI控制器对象进行通信。
在主线程上,我们有GUI控制器,tkinter主循环和实际的Tkinter GUI类。
下面是一些代码,以使其更清楚:
clientlist = []
#queue's for communicating with server thread
buffer = queue.Queue()
buffer2 = queue.Queue()
root = Tk()
#GUI controller
controller = Controller(buffer,buffer2,clientlist,root)
#Make Tkinter GUI and give a reference to the controller
top = MainWindow(controller, root)
#Giving Tkinter GUI reference to the controller
controller.set_top(top)
t1 = threading.Thread(target=run_server, args=(buffer,buffer2))
t1.start()
controller.check_connections()
root.protocol("WM_DELETE_WINDOW", on_closing)
try:
while controller.run:
root.mainloop()
print("[i] Joining server thread.")
t1.join()
我很难找到使Tkinter GUI与GUI控制器通信的好方法。我在这里要互相参考的想法是行不通的:
如果我给 MainWindow 提供对 Controller 的引用,则需要将其保存到 MainWindow 的构造函数中的变量中。然后,我需要在每个循环中更新该变量,这是非常苛刻的。
我该如何给参考提供正确的方法,还是有更好的方法让这两个类进行交流?
非常感谢!
答案 0 :(得分:0)
我将Tkinter GUI类和控制器类都移到了自己的.py
文件中,而不是将它们都放在同一个文件中时,解决了这个问题。
我发现我忘记了一些self.
,因此控制器将尝试访问在全局范围内定义的GUI对象,而不是我给出的引用。放置完这些self.
后,一切都按预期工作了!
对于其他人: 如果要给两个对象互相引用:
给每个类一个方法,以使用实际引用重新分配该占位符 (将对象作为参数)
不要忘记调用另一个 object 的 objects引用。 (使用self.
)