gpt4 book ai didi

user-interface - wxpython 使用 time.sleep() 不阻塞完整的 GUI

转载 作者:行者123 更新时间:2023-12-04 04:32:05 28 4
gpt4 key购买 nike

我想在特定时间间隔更改我的 GUI 中显示的文本。经过很多方法,我发现,具体到我的要求,我必须使用 time.sleep() 而不是 wx.Timer,但是 time.sleep () 卡住完整的 GUI。这是我的代码示例:

import wx
import time

DWELL_TIMES = [1, 2, 1, 3]
SCREEN_STRINGS = ['nudge nudge', 'wink wink', 'I bet she does', 'say no more!']

class DM1(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
panel = wx.Panel(self)
text_display = wx.StaticText(panel, pos = (400, 150))

for dwell_time in DWELL_TIMES:
text_display.SetLabel(SCREEN_STRINGS[dwell_time])
time.sleep(float(DWELL_TIMES[dwell_time]))


app = wx.App()
DM1Frame = DM1(None, size = (800, 600))
DM1Frame.Center()
DM1Frame.Show()
app.MainLoop()

有人知道为什么会这样吗,以及如何使 GUI 不阻塞?我想 Threading 可以帮助我,不是吗?如果是这样,将线程放入此代码的正确方法是什么? Threading 有替代方案吗?

非常感谢!

最佳答案

正如其他人所提到的,wx.CallAfterwx.CallLater 是您的 friend 。研究它们并学习它们。这是一个使用 wx.CallLater 的完整的工作示例。我包括了其他我认为合适的重构。

import wx

DATA = [
(1, 'nudge nudge'),
(2, 'wink wink'),
(1, 'I bet she does'),
(3, 'say no more!'),
]

class Frame(wx.Frame):
def __init__(self):
super(Frame, self).__init__(None)
panel = wx.Panel(self)
self.text = wx.StaticText(panel)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.AddStretchSpacer(1)
sizer.Add(self.text, 0, wx.ALIGN_CENTER)
sizer.AddStretchSpacer(1)
panel.SetSizer(sizer)
self.index = 0
self.update()
def update(self):
duration, label = DATA[self.index]
self.text.SetLabel(label)
self.index = (self.index + 1) % len(DATA)
wx.CallLater(int(duration * 1000), self.update)

if __name__ == '__main__':
app = wx.App(None)
frame = Frame()
frame.SetTitle('Example')
frame.SetSize((400, 300))
frame.Center()
frame.Show()
app.MainLoop()

关于user-interface - wxpython 使用 time.sleep() 不阻塞完整的 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216139/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com