Python 中休眠函数上的帧加载器

问题描述 投票:0回答:1

我写了这段代码,但我无法获得预期的行为,我想我必须使用线程,但我不知道如何正确使用它:(

我想要的是第二个框架继续显示加载,而主框架运行睡眠功能。

这是代码:

import threading
import time
import wx

class MainFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, None, id, "My main frame", wx.DefaultPosition, wx.Size(500, 300),style=wx.MINIMIZE_BOX|wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX|wx.STAY_ON_TOP)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.panel = wx.Panel(self,-1)
        self.panel.Fit()
        self.panel.Show()

        #This will freeze while sleeping...
        #self.loader = Loader(self,-1,title)
        #self.loader.Show()
        
        self.button = wx.Button(self.panel,-1,"Go To Sleep")
        self.Bind(wx.EVT_BUTTON, self.sleepy_func, self.button)

        self.another_button = wx.Button(self.panel,-1,"Go To Another Sleep")
        self.Bind(wx.EVT_BUTTON, self.another_sleepy_func, self.another_button)

        sizer.AddStretchSpacer(1)
        sizer.Add(self.button, 0, wx.ALIGN_CENTER)
        sizer.AddSpacer(20)
        sizer.Add(self.another_button, 0, wx.ALIGN_CENTER)
        sizer.AddStretchSpacer(1)

        self.panel.SetSizerAndFit(sizer)
        
    def sleepy_func(self,evt):
        time.sleep(10)

    def another_sleepy_func(self,evt):
        time.sleep(10)
        
class Loader(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, None, id, "Please Wait...", wx.DefaultPosition, wx.Size(500, 300),style=wx.MINIMIZE_BOX|wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX|wx.STAY_ON_TOP)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.panel = wx.Panel(self,-1)
        self.panel.Fit()
        self.panel.Show()

        self.txt = wx.StaticText(self.panel,-1,"Please Wait...")
        self.spinner = wx.ActivityIndicator(self.panel, size=(30, 30))

        sizer.AddStretchSpacer(1)
        sizer.Add(self.txt, 0, wx.ALIGN_CENTER)
        sizer.Add(self.spinner, 1, wx.ALIGN_CENTER)
        sizer.AddStretchSpacer(1)

        self.panel.SetSizerAndFit(sizer)
        self.spinner.Start()

        #usage : put in wx.Frame class, then call Show/Hide or Destroy

if __name__ == "__main__":
    app = wx.App()
    frame = MainFrame(None,-1,None)
    frame.Show(True)
    frame.Centre()
    app.MainLoop()

感谢大家的帮助!以前从未使用过线程...

我没有让我的线程测试,它太乱了而且不起作用!

已经尝试过的解决方案:线程多处理

python multithreading wxpython sleep loader
1个回答
0
投票

我想我终于自己得到了它,如果有人能证实那就太好了!

这是 *** ithink 工作代码***

import threading
import time
import wx

def threaded(fn):
    def wrapper(*args, **kwargs):
        threading.Thread(target=fn, args=args, kwargs=kwargs).start()
    return wrapper

class MainFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, None, id, title, wx.DefaultPosition, wx.Size(500, 300),style=wx.MINIMIZE_BOX|wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX|wx.STAY_ON_TOP)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.panel = wx.Panel(self,-1)
        self.panel.Fit()
        self.panel.Show()

        self.loader = Loader(self,-1,"Test loading...")       
        
        self.button = wx.Button(self.panel,-1,"Show loading")
        self.Bind(wx.EVT_BUTTON, self.show_loading, self.button)

        self.button2 = wx.Button(self.panel,-1,"Sleep")
        self.Bind(wx.EVT_BUTTON, self.another_sleepy_func, self.button2)

        sizer.AddStretchSpacer(1)
        sizer.Add(self.button, 0, wx.ALIGN_CENTER)
        sizer.AddSpacer(10)
        sizer.Add(self.button2, 0, wx.ALIGN_CENTER)
        sizer.AddStretchSpacer(1)

        self.panel.SetSizerAndFit(sizer) 

    @threaded
    def show_loading(self,evt):
        self.loader.Show()
        
    @threaded
    def another_sleepy_func(self,evt):
        print("sleeping")
        for i in range(10,0,-1):
            time.sleep(1)
            print (i)
        
class Loader(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, None, id, title, wx.DefaultPosition, wx.Size(500, 300),style=wx.MINIMIZE_BOX|wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX|wx.STAY_ON_TOP)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.panel = wx.Panel(self,-1)
        self.panel.Fit()
        self.panel.Show()

        self.txt = wx.StaticText(self.panel,-1,"Please Wait...")
        self.spinner = wx.ActivityIndicator(self.panel, size=(30, 30))

        sizer.AddStretchSpacer(1)
        sizer.Add(self.txt, 0, wx.ALIGN_CENTER)
        sizer.Add(self.spinner, 1, wx.ALIGN_CENTER)
        sizer.AddStretchSpacer(1)

        self.panel.SetSizerAndFit(sizer)
        self.spinner.Start()

        #usage : put in wx.Frame class, then call Show/Hide or Destroy

if __name__ == "__main__":
    app = wx.App()
    frame = MainFrame(None,-1,"Main frame")
    frame.Show(True)
    frame.Centre()
    app.MainLoop()
© www.soinside.com 2019 - 2024. All rights reserved.