我已經看到很多關於在子進程或線程中運行代碼的東西,並且使用了multiprocessing
和threading
模塊,這非常簡單。但是,在GUI中這樣做會增加額外的複雜性。在一個子進程中執行python腳本 - 使用圖形
從我所瞭解的情況來看,如果您嘗試從多個線程(或進程)操縱它們,GUI類不會喜歡它。解決方法是將數據從您創建它的任何線程發送到負責圖形的線程,然後將其呈現在那裏。
不幸的是,對於我想到的情況,這不是一個選項:我創建的GUI允許用戶編寫自己的繪圖代碼,然後執行。這意味着我無法控制他們如何精確繪製,也不想擁有它。 (更新:這些圖被顯示在單獨的窗口中,並且不需要被嵌入主GUI中的任何位置。我想要的是讓它們與主GUI分離存在,而不共享任何底層的圖形庫。)
那麼,我現在不知道是
是否有與自己聯繫的窗口系統一個全新的解釋實例上執行的Python代碼串的一些乾淨的(ISH)的方式?
響應於該評論:
當前應用程序被設置爲如下:一個簡單的Python腳本加載的wxPython GUI(一個wx.App)。使用這個gui用戶可以設置一個模擬,其中一部分涉及用普通python創建一個腳本,該腳本運行模擬並對結果進行後處理(通常涉及製作圖並顯示它們)。目前我只需在腳本代碼上調用exec()即可完成此操作。這工作正常,但gui在仿真運行時凍結。我已經嘗試在子進程中運行嵌入式腳本,這也可以正常工作,直到您嘗試顯示創建的圖(通常使用matplotlib的show())。在這一點上,一些深藏在wxPython,wx,gtk等堆棧中的庫開始抱怨,因爲你無法從多個線程操縱它。 我想的設置的設置大致相同,但不是與主應用程序共享GUI的嵌入式腳本,而是希望它在自己的環境中顯示圖形。
而只是爲了澄清:
這是不是有關問題:「我該怎麼辦多線程/多」,甚至是「我如何做一個單一的wxPython GUI中的多線程/多」。問題是我怎樣才能從開始一個腳本gui加載完整的新的 gui。我如何讓窗口管理器將此腳本看作完全獨立的應用程序?
最簡單的方法是將其生成在某個臨時文件夾中,然後對python解釋器進行非阻塞調用,但這會使通信更加困難,並且很難知道何時可以刪除臨時文件。我希望有一個更乾淨,更動態的方式來做到這一點。
我不確定您的應用程序和進程是如何設置的。你能描述一下你今天擁有什麼,以及你想如何擁有它? – Macke
什麼(如果有)數據在您的應用程序和腳本之間共享? – Macke
幾乎沒有。一個未被主GUI使用的對象被傳遞給嵌入式腳本。如果可能,應該捕獲腳本輸出的文本並將其傳回主GUI。 –