2014-09-11 47 views
2

看來,如果我們開發多線程應用程序,我們不能認爲它會在其他操作系統中運行相同。爲什麼在Windows中我可以在Twisted reactor.callInThread()中運行Kivy app.run(),但不能在OSX中運行?

我正在開發一個Kivy應用程序,但這個Kivy應用程序實際上是從一個扭曲的reactor.callInThread()中啓動的。這是代碼片段:

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() 

上面的代碼片段在Windows中工作得非常好。但在OSX中:Kivy主應用程序窗口未顯示。檢查日誌文件,沒有錯。沒有警告或錯誤發生。

關於如何解決這個問題的任何想法?或者,你認爲我是否以錯誤的方式構建了這個應用程序?也就是說,我應該使用Kivy應用程序循環來代替扭曲對主應用程序循環的控制嗎?

+2

我不使用扭曲,但你可能會發現http://kivy.org/docs/guide/other-frameworks.html在kivy內運行扭曲感興趣。 – inclement 2014-09-11 10:13:17

+1

我對你有壞消息。即使你開發一個*單線程應用程序,你也不能確定它會在每個操作系統上運行。 :) – 2014-09-11 12:15:02

+0

@inclement是的,我其實已經讀過它。但肯定會很想知道上述代碼未按預期運行的原因 – swdev 2014-09-11 15:27:25

回答

3

Twisted在不同的平臺上使用不同的反應器實現 - 並且Windows中使用的實現是Windows特定的,並且不在其他平臺上使用。所以這可能是爲什麼它在一個平臺上而不是另一個平臺上運行。

使用Kivy和Twisted的正確方法是在上面提供的documentation中。 Kivy將從Kivy的EventLoop中迭代Twisted循環。這工作完美無缺 - 我的Kivy應用程序嚴重依賴Twisted。

+1

我認爲你是對的部分反應堆實施是操作系統特定的。上面的代碼完美地運行於PyQt應用程序中(但是實際上,它只是在Windows上設計的產品,未在OSX中測試過)。我明白了..讓我在我的代碼中應用上述文檔指南。我可能必須以這種方式重新設計我的應用程序 – swdev 2014-09-11 15:30:53

+0

我接受了@Ryan答案,儘管要使用的確切代碼來自https://github.com/kivy/kivy/issues/214,它來自以下github問題:https://github.com/kivy/kivy/issues/214。我只是實現'_reactor_init()'及其所有依賴方法。之後,Ryan表示,對reactor.callInThread或reactor.callFromThread的調用完美無缺:在OSX/Windows中。總結這一點,在Windows中,沒有安裝Kivy reactor,程序工作正常。但它不會在OSX上運行。要使應用程序在兩個操作系統上運行,您必須安裝Kivy提供的反應器。謝謝! – swdev 2014-09-11 23:34:00

+1

@swdev你不需要那樣做。 'kivy.support.install_twisted_reactor()'是由hansent在他的要點中使用代碼創建的。他們幾乎完成了同樣的事情,除了Kivy中的代碼一直保持最新的錯誤修復,這些錯誤修復的要點並沒有。 – 2014-09-12 14:59:31

相關問題