【问题标题】:Why in Windows I can run Kivy app.run() from within Twisted reactor.callInThread(), but not in OSX?为什么在 Windows 中我可以在 Twisted reactor.callInThread() 中运行 Kivy app.run(),但在 OSX 中却不行?
【发布时间】:2014-09-11 10:06:00
【问题描述】:

似乎如果我们开发一个多线程应用程序,我们不能想当然地认为它会在其他操作系统中运行。

我正在开发一个 Kivy 应用程序,但这个 Kivy 应用程序实际上是从一个扭曲的 reactor.callInThread() 中启动的。这是代码的sn-p:

from twisted.internet import reactor
def start_kivy():
    app = SomeKivyApp()
    app.run()

if __name__ == '__main__':
    reactor.callInThread(start_kivy)
    #it will open Kivy main application window in Windows, but not in OSX
    reactor.run()

上面的 sn-p 在 Windows 中运行得非常好。但在 OSX 中:未显示 Kivy 主应用程序窗口。检查日志文件,没有错。未出现警告或错误。

关于如何解决这个问题的任何想法?或者,您是否认为我以错误的方式构建了这个应用程序?也就是说,我应该使用 Kivy 应用程序循环,而不是让twisted 控制主应用程序循环吗?

【问题讨论】:

  • 我不使用twisted,但您可能会发现kivy.org/docs/guide/other-frameworks.html 在kivy 中使用twisted 很有趣。
  • 我有个坏消息要告诉你。即使您开发了一个单线程应用程序,您也不能确定它在每个操作系统上的运行都是一样的! :)
  • @inclement 是的,我实际上已经阅读了它。但肯定很想知道上述代码没有按预期运行的原因
  • @Jean-PaulCalderone :D 不得不说,这可能是我假设中最容易注意到的错误!

标签: macos twisted kivy


【解决方案1】:

Twisted 在不同平台上使用不同的反应器实现 - 在 Windows 中使用的实现是特定于 Windows 的,不用于其他平台。所以这可能就是为什么它可以在一个平台而不是另一个平台上工作的原因。

使用 Kivy 和 Twisted 的正确方法是在上面提供的documentation inclement 中。 Kivy 将从 Kivy 的 EventLoop 中迭代 Twisted 循环。这完美无缺——我的 Kivy 应用程序严重依赖 Twisted。

【讨论】:

  • 我认为你说得对,反应堆实现是特定于操作系统的。上面的代码非常适合 PyQt 应用程序(...但实际上,它只是在 Windows 上设计的产品。尚未在 OSX 中测试过)。我明白了.. 让我在我的代码中应用上述文档指南。我可能不得不以这种方式重新设计我的应用程序
  • 我接受了@Ryan 的回答,尽管要使用的确切代码在 github.com/kivy/kivy/issues/214 的这个要点中,来自以下 github 问题:github.com/kivy/kivy/issues/214。我只是实现_reactor_init() 及其所有相关方法。之后,正如 Ryan 所说,对 reactor.callInThreadreactor.callFromThread 的调用完美无缺:在 OSX/Windows 中。总而言之,在 Windows 中,无需安装 Kivy reactor,该程序就可以正常工作。但它不会在 OSX 上运行。要使应用程序在两个操作系统上运行,您必须安装 Kivy 提供的反应器。谢谢!
  • @swdev 你不需要这样做。 kivy.support.install_twisted_reactor() 是由 hansent 使用他的要点中的代码创建的。他们做几乎相同的事情,除了 Kivy 中的代码已经与 gist 没有的任何错误修复保持同步。
  • 谢谢瑞恩!那么我需要更好地查看我的代码。目前应用程序运行良好(好吧,不确定它是否会遇到任何错误)。将告知进展情况。
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 2017-03-12
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多