2012-07-07 24 views
2

在重新定位位圖按鈕後,在我的wxPython代碼中使用time.sleep導致我的按鈕完全變爲空白。在該按鈕應該出現的區域留下一個空白區域。任何人都可以解釋原因並提出任何解決方案嗎?這是我的代碼:在wxPython中使用time.sleep

import wx 
import time 
class gui(wx.Frame): 
    def __init__(self,parent,id): 
    wx.Frame.__init__(self,parent,id,'New Window',pos=(0,0),size=wx.DisplaySize()) 
    panel=wx.Panel(self) 
    self.SetBackGroundColour('green') 
    self.pic=wx.BitmapButton(self,-1,wx.Image("Candle.jpg",wx.BITMAP_TYPE_ANY).ConvertToBitmap(),pos=(700,300)) 
    self.Bind(wx.EVT_BUTTON,self.position,self.pic) 
    def positon(self,event): 
    self.pic.Hide() 
    self.pic=wx.BitmapButton(self,-1,wx.Image("Candle.jpg",wx.BITMAP_TYPE_ANY).ConvertToBitmap(),pos=(700,300)) 
    time.sleep(2) 
    self.pic.Hide() 
if __name__=='__main__': 
    app=wx.PySimpleApp() 
    frame=gui(None,-1) 
    frame.Show() 
    app.MainLoop() 
+0

你能告訴我們你的代碼嗎? – 2012-07-07 18:04:45

回答

1

time.sleep()會阻塞wx的主循環,並使得GUI無法響應,只要您已經告訴它睡眠。有幾種選擇。您可以使用wx.Timer或使用threads(或類似的)。我認爲在你的用例中使用Timer會更有意義。

+0

非常感謝。我後來使用wx.CallLater解決了這個問題,但我正在尋找一個爲什麼圖像變爲空白的原因。你提供了它,所以再次感謝。 – zer0nes 2012-07-09 14:37:03

0

好吧,這取決於時間睡眠在按鈕的事件?,因爲我相信如果是因爲這一點。按鈕等待它觸發的事件結束,以便它返回到其初始狀態。

+0

嗯是的time.sleep確實在按鈕的事件。我已經添加了代碼。你能提出任何方法來擺脫它。我是這個領域的絕對新手,對於如何解決這個問題毫無頭緒。 – zer0nes 2012-07-07 19:02:18

2

好吧,難怪你的按鈕一片空白,你已經非常編程它。

self.pic.Hide() => hides the button 
self.pic=wx.BitmapButton(self,-1,wx.Image("Candle.jpg",wx.BITMAP_TYPE_ANY).ConvertToBitmap(),pos=(700,300)) => displays the button once again 
    time.sleep(2) => takes a brake for 2 seconds 
    self.pic.Hide() => hides the button again 

結論是,您的按鈕不會顯示出來。所以我不明白有什麼問題,因爲它確實是你編程的。

+0

我沒有得到你。顯示按鈕後,它不應該在那裏,直到我再次隱藏它,這是我在2秒後做的。 – zer0nes 2012-07-07 19:57:38

+0

直到它自己隱藏。按下按鈕後,它會隱藏,再次顯示並保持2秒鐘並再次隱藏。 – 2012-07-07 20:51:56

+0

但是,你如何解釋圖像空白。它應該顯示圖像2秒,對吧?我使用wx.CallLater解決了這個問題,但我仍然想知道背後的原因。 – zer0nes 2012-07-07 22:07:11

0

sleep正在阻塞,所以執行會停留在您的位置方法中兩秒鐘,並且無法返回到MainLoop以處理其他事件,如將更改繪製到屏幕上。兩秒鐘後,圖像被隱藏,但從未畫出。

爲了達到想要的效果,您必須啓動計時器,並將計時器綁定到可以再次顯示StaticBitmap的處理程序。

通過你也可以再打電話Show而不是創建一個新的控制方式,並且它的父也應該是面板,而不是框架。