【问题标题】:using time.sleep in wxPython在 wxPython 中使用 time.sleep
【发布时间】:2012-07-07 17:49:25
【问题描述】:

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

【问题讨论】:

    标签: python user-interface wxpython


    【解决方案1】:

    好吧,难怪你的按钮会变成空白,你几乎已经对其进行了编程。

        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
    

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

    【讨论】:

    • 我没有得到你。显示按钮后,它不应该在那里,直到我再次隐藏它,我在 2 秒后这样做。
    • 直到它自己隐藏。按下按钮后它会隐藏,再次显示并停留 2 秒并再次隐藏。
    • 但是您如何解释图像变为空白。它应该显示图像 2 秒,对吧?我使用 wx.CallLater 解决了这个问题,但我仍然想知道这背后的原因。
    【解决方案2】:

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

    【讨论】:

    • 非常感谢。我后来使用 wx.CallLater 解决了这个问题,但我一直在寻找图像为何变为空白的原因。你提供了,再次感谢。
    【解决方案3】:

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

    【讨论】:

    • 好吧 time.sleep 确实在按钮的事件中。我现在已经添加了代码。你能建议任何方法来摆脱它。我是这个领域的绝对新手,不知道如何解决这个问题。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2019-11-22
      • 2020-07-05
      • 1970-01-01
      • 2011-08-16
      • 2019-05-16
      相关资源
      最近更新 更多