【问题标题】:Can the main loop of a program be moved out of GUI?可以将程序的主循环移出 GUI 吗?
【发布时间】:2011-01-27 03:02:44
【问题描述】:

如果这很重要,我正在使用 python 3 / tkinter。

在查看代码示例时,我注意到主循环通常位于代码的 GUI 部分,其余代码提供回调供 GUI 在需要时调用。

但是我的模拟运行独立于用户交互; UI 可以不时提供模拟中发生的情况的视图,但它不控制模拟中发生的情况。所以我希望主循环关注模拟而不是 UI。我该怎么做?

【问题讨论】:

  • 不知道 python/tkinter,但是例如Qt 允许多个事件循环,以及非 UI 线程中的事件循环。
  • 是否有一个 GUI 工具包,它甚至不需要 mainloop 类型的构造,并且只公开一个可以调用其方法来显示内容的对象? (我知道这很不寻常,我只是好奇)

标签: python design-patterns user-interface tkinter


【解决方案1】:

为什么不将您的逻辑和演示分开。编写您的 sim 后端以响应基于单个文本的协议以接收 cmds 并发送回结果,然后只需通过您的 gui 程序与它交谈,例如unix 套接字。

【讨论】:

    【解决方案2】:

    编写您自己的主循环,调用检查和处理 GUI 事件的函数。

    【讨论】:

    • 如果我这样做,有什么需要注意的吗?我只是在学习tk/tkinter,但是我的GUI需求比较简单。
    • 只有你不处理 GUI 消息的每一秒都是你的 GUI 保持无响应的另一秒。
    • tkinter 是用于此特定目的的合理工具吗?另外,GUI 功能通常不分离到自己的线程中是否有任何原因?
    • 对不起,我很困惑:所以你是说有一种方法可以使用 tkinter 而无需调用它的主循环,只要我愿意编写一些额外的代码?
    • 这基本上就是它的要点,是的。
    【解决方案3】:

    在这种情况下,您应该在单独的线程中执行处理,然后让 GUI 线程向该线程发送和接收消息。

    但是,不要尝试直接从处理线程更新 GUI。相反,您可以使用消息队列向 GUI 发送消息,类似于effbot's example。重要的是queue.get_nowait():如果队列中没有任何内容,您可以定期在您的 GUI 中运行它而不会阻塞其他线程。

    【讨论】:

    • 我指的是一个单独的线程。然而,只有队列需要在 GUI 和处理线程之间共享。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2016-03-12
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多