2013-06-18 55 views
-1

我正在玩運動控制器,因此要「點擊」一個按鈕我在哪裏找出哪個按鈕最接近中間點,然後使用button.invoke( ) 方法。Python tkinter button.invoke方法問題

我相信按鈕和設置工作,因爲每當我點擊按鈕 - 他們工作正常。但是,當通過「button.invoke」方法調用按鈕時,整個事情就會凍結。

其他可能有用的信息: - gui通過.mainloop函數在它自己的線程中被更新。 - 當被鼠標點擊時,一切正常工作 - 在進行簡單的打印操作時,button.invoke()方法正常工作。它只在切換幀時凍結。

任何幫助將是偉大的,謝謝。

+4

你可以分享一些代碼來向我們展示更多的工作,尤其是'button.invoke()'裏面發生了什麼。 – Oren

+1

另外,'button.invoke'是從不同於'mainloop'的線程調用的嗎?這在tkinter中不合法;它可能在某些情況下有效,但在其他情況下可能有效,或者相同的情況可能有時但並非總是有效,或者它可能在一個平臺或Tk版本上運行,但不能運行在另一個平臺上,但如果它有效,那只是因爲你幸運;它不應該。 – abarnert

+0

我想你已經在那裏碰到了問題。問題是線程A正在運行mainloop(),它只是等待一些東西,所以它永遠不會離開那一行。線程B在使用運動控制器時調用按鈕。 我應該真的改變我的問題在這一點上,「我怎麼只運行」Mainloop「有限的時間?或者改變一些東西,所以mainloop會處理這個變化」 – user2498925

回答

0

你是說mainloop運行在一個單獨的線程中,從你創建窗口小部件的地方運行?如果是這樣,那就是你的問題。你只能從一個線程中調用tkinter函數。

+0

對不起,我應該更清楚。所以這裏的問題是: Thead A - 負責在初始化過程中進行GUI操作,並運行「a.mainloop()」 這很好,當它檢測到它自己的按鈕點擊。 線程B - 控制運動相機。因爲他們的想法是不使用鼠標,所以我使用「closest_button.invoke()」方法。 但是 - 這意味着命令從線程B開始,因爲與按鈕單擊不同,它不是gui上的變化(不是物理按鈕按下,只是執行相關的命令),然後線程A在主循環中選擇 - 它正在調用該命令。 – user2498925

+0

@ user2498925:您無法從另一個線程運行'invoke'方法。常見的解決方案是讓線程將某些內容放在線程安全隊列中,然後讓GUI線程定期輪詢隊列。在stackoverflow上有這樣的例子。 –

+0

然而,問題在於GUI線程正在運行mainloop函數。在GUI死亡之前不會執行任何其他行。 – user2498925