如何解决Tkinter回调至主模块
我在Tkinter中构建了一个简单的单脚本GUI应用程序,该应用程序可以按预期工作。由于Tk控件的代码占用了600行脚本的一半,因此我试图通过将GUI与主应用程序分开放置在单独的模块中。
在main.py文件中,我有:
from mytkfile import MainWindow
def main():
"""Main program entry point."""
decks = initialize()
app = App(decks)
app.view.root.mainloop()
if __name__ == '__main__':
main()
在mytkfile.py中,只有一个巨大的MainWindow类,该类当前正在处理对不同接口元素的回调:
import tkinter as tk
from tkinter import ttk
class MainWindow:
def __init__(self,deck):
self.root = tk.Tk()
# ...
简化后的main.py中的App类如下:
class App:
def __init__(self,decks):
self.decks = decks
# ...
self.view = MainWindow(self.deck)
self.updateview()
def updateview(self):
# call several self.view.update_methods
绘制主窗口并基本上按原样工作,因为MainWindow本身会处理许多数据逻辑。但是,我想更改它,让App处理所有事情,只要求MainWindow进行自我更新。我试图在不实例化时将应用程序自身传递给MainWindow的情况下实现这一目标,因为据我了解,View不应了解其Controller,也不应调用自己的方法来处理数据逻辑。
问题是,我该如何处理MainWindow对应用程序一无所知时,Tk中的按钮回调如何?
解决方法
在阅读了Python中的观察者设计模式的various articles之后,我得出结论,在我的代码中将Tkinter视图MainWindow类至少与模型/控制器App类耦合至少是不可能的。 App类将自身传递给MainWindow,并通过Tk按钮通知单击以回调App内部的回调函数,从而解决了该问题。就像魅力一样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。