2017-09-17 88 views
0

我正在嘗試獲取appJarpython3的GUI編程實踐經驗。我正在嘗試添加按鈕按下時發生的操作。它工作正常,但它奇怪地結束。appJar python:按下按鈕動作

部分代碼如下。只要按下按鈕,就會調用「按下」功能。它工作正常。但是,當計數達到0時,數字0未被按下(儘管按照代碼,數字0應打印在名爲「lb1」的標籤上)。 當按下按鈕並且count變量= 1時,計數變量應該減1,然後標籤文本應該用新計數編號更新。然後,它檢查計數器是否爲0,如果爲true,則退出代碼。 現在,表單在用新值更新標籤之前終止。通過一些故障排除,我發現標籤值僅在表單終止時更新,儘管更新它的代碼行已經執行。

任何人都可以對此有所瞭解?

from appJar import gui 
count=10 
def pressed(btnName): 
    global count 
    count-=1 
    win.setLabel("lb1","Count= "+ str(count)) 
    if count==0: 
     win.stop() 

回答

0

我想你所看到的是預期的行爲。

當計數達到0時 - 標籤更新排隊等待發生,但隨後下一行代碼停止GUI,這將在幾毫秒後發生 - 因此在有機會更新GUI之前GUI將會消失屏幕上顯示的內容。

如果要在標籤更新和GUI關閉之間引入一個小的延遲,可以使用.after()函數。

例如:

if count == 0: 
    win.after(500, win.stop) 

這將調用停止功能之前延遲500毫秒。


另外,如果你想在GUI保持開放,顯示Count= 0,只有關閉用戶按下按鈕接下來的時間,改變你原來的代碼僅調用win.stop()count == -1


因此,完整的代碼可能如下所示:

from appJar import gui 
count=10 
def pressed(btnName): 
    global count 
    count-=1 
    win.setLabel("lb1","Count= "+ str(count)) 
    if count == 0: 
     win.after(500, win.stop) 

win = gui() 
win.addLabel("lb1", "empty") 
win.addButton("PRESS", pressed) 
win.go() 
+0

非常感謝您的回覆。我在win.stop()之前使用了sleep(),但它不起作用。該標籤僅在功能退出時才更新 我試過你的解決方案。它沒有像你解釋的那樣工作。我使用.after(),但無論我使用什麼值,在計數器達到零後,GUI窗體立即退出。儘管如此,程序結束延遲(我可以從控制檯看到),但不是GUI。換句話說,GUI表單立即退出,但程序繼續運行以配置_delay_值。 我可以得出結論:.after()方法在GUI退出之後添加延遲,而不是之前。 –

+0

使用'sleep()'會暫停GUI線程 - 防止發生任何更新。一旦'sleep()'完成,GUI將立即退出 - 所以你不會看到標籤更新。 我已更新我的原始答案以包含示例代碼清單。 '.after()'在GUI的事件循環中排隊函數調用,所以GUI將被更新,並且只有在指定的毫秒數(在本例中爲500)之後GUI纔會退出。 –

+0

非常感謝。這解決了問題。仔細檢查代碼後,我發現我沒有準確使用.after()方法。我寫了win.after(200,win.stop()) 而不是 win.after(200,win.stop) 這就是爲什麼我第一次沒有工作。現在它的工作成功了。謝謝。 –