两个 类 相互引用
Two classes having references to each other
我正在使用异步 TCP 服务器。
一切顺利,我从中学到了很多东西,但我有一个与结构相关的问题。
结构如下所示:
Server 对象是一个异步 TCP 服务器 运行 在它自己的线程中。
它通过线程安全队列与 GUI 控制器对象通信。
在主线程上,我们有 GUI 控制器、tkinter 主循环和实际的 Tkinter GUI class。
这里有一些代码可以使它更清楚:
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 控制器通信的好方法。我在这里相互引用的想法 class 行不通:
如果我给 MainWindow 一个对 Controller 的引用,我需要将它保存到 [=35] 的构造函数中的一个变量=]主窗口。然后我需要在每个循环中更新该变量,这是非常苛刻的。
我怎样才能给出正确的参考,或者有没有更好的方法让这两个 class 交流?
非常感谢!
我在将 Tkinter GUI class 和控制器 class 移动到它们自己的 .py
文件而不是将两者放在同一个文件中时修复了这个问题。
我发现我忘记了一些 self.
,所以控制器会尝试访问在全局范围内定义的 GUI 对象,而不是我提供的引用。放置这些 self.
后,一切都如我所料!
所以对于其他人来说:
如果你想给两个对象一个相互引用:
- 在每个构造函数中为其他对象设置一个占位符。 (感谢@Dashadower)
给每个 class 一个方法,用实际引用重新分配占位符
(给对象作为参数)
不要忘记调用另一个对象的对象引用。 (使用 self.
)
我正在使用异步 TCP 服务器。
一切顺利,我从中学到了很多东西,但我有一个与结构相关的问题。
结构如下所示:
Server 对象是一个异步 TCP 服务器 运行 在它自己的线程中。 它通过线程安全队列与 GUI 控制器对象通信。
在主线程上,我们有 GUI 控制器、tkinter 主循环和实际的 Tkinter GUI class。
这里有一些代码可以使它更清楚:
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 控制器通信的好方法。我在这里相互引用的想法 class 行不通:
如果我给 MainWindow 一个对 Controller 的引用,我需要将它保存到 [=35] 的构造函数中的一个变量=]主窗口。然后我需要在每个循环中更新该变量,这是非常苛刻的。
我怎样才能给出正确的参考,或者有没有更好的方法让这两个 class 交流?
非常感谢!
我在将 Tkinter GUI class 和控制器 class 移动到它们自己的 .py
文件而不是将两者放在同一个文件中时修复了这个问题。
我发现我忘记了一些 self.
,所以控制器会尝试访问在全局范围内定义的 GUI 对象,而不是我提供的引用。放置这些 self.
后,一切都如我所料!
所以对于其他人来说: 如果你想给两个对象一个相互引用:
- 在每个构造函数中为其他对象设置一个占位符。 (感谢@Dashadower)
给每个 class 一个方法,用实际引用重新分配占位符 (给对象作为参数)
不要忘记调用另一个对象的对象引用。 (使用
self.
)