2

在重新定位位图按钮后,在我的 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()
4

4 回答 4

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

结论是,您的按钮不会出现。所以我看不出有什么问题,因为它完全按照您的编程方式执行。

于 2012-07-07T19:26:40.217 回答
1

time.sleep() 会阻塞 wx 的主循环并使 GUI 在您告诉它休眠的时间长短都没有响应。有几种选择。您可以使用wx.Timer或使用线程(或类似的)。不过,我认为在您的用例中使用 Timer 更有意义。

于 2012-07-09T13:36:21.013 回答
0

好吧,这取决于按钮事件中是否使用了时间睡眠?因为我相信是因为它。按钮等待它触发的事件结束,以便返回到初始状态。

于 2012-07-07T18:21:53.507 回答
0

sleep是阻塞的,因此执行在您的位置方法中停留了两秒钟,并且无法返回 MainLoop 处理其他事件,例如将您的更改绘制到屏幕上。两秒钟后,图像被隐藏,但从未被绘制。

要获得您想要的效果,您必须启动一个计时器,并将计时器绑定到可以StaticBitmap再次显示的处理程序。

顺便说一句,您也可以Show再次调用而不是创建新控件,它的父级也应该是面板,而不是框架。

于 2012-07-08T22:43:59.237 回答