1

このことを考慮:

import wx, time

# STEP 1: Setup Window
class Window(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Bobby the Window', size=(300,200))
        panel = wx.Panel(self)
        self.Bind(wx.EVT_CLOSE, self.closewindow)

    wx.StaticText(panel, -1, "Yo user, the program is busy doing stuff!", (50,100), (200,100))

def closewindow(self, event):
    self.Destroy()

# STEP 2: Show Window (run in background, probably with threading, if that is the best way)
if __name__=='__main__':
    app = wx.PySimpleApp()
    frame = Window(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

# STEP 3: Do work
time.sleep(5)

# STEP 4: Close Window, and show user evidence of work
## *Update window to say: "I am done, heres what I got for you: ^blah blah info!^"*
exit()

私の質問は次のとおりです。

  • ステップ4で、ウィンドウ内のテキストを変更するにはどうすればよいですか(特にスレッド内にある場合)?
  • ステップ2で、ウィンドウをバックグラウンドで実行し、それでも通信できるようにするにはどうすればよいですか?(テキストなどを更新するため)

これは、GUIウィンドウを除いて、CLIプログレスバーを実行して同時に作業する方法についての私の質問に似ています。

StaticTextを変更するには、'text.SetLabel( "BLAH!")'を実行することを知っていますが、ウィンドウクラスがバックグラウンドで実行されている場合、それをウィンドウクラスとどのように通信しますか?

更新: このスレッドもいくつかの助けになりました。

4

1 に答える 1

1

長時間実行されるプロセスを実行する必要がある場合は、何らかの種類のスレッドまたはおそらくマルチプロセッシングモジュールを使用する必要があります。そうしないと、GUIのメインループがブロックされ、応答しなくなります。また、スレッドからGUIと通信するには、wxPythonのスレッドセーフメソッドを使用する必要があります。それらは、wx.CallAfter、wx.CallLater、およびwx.PostEventです。

wxPythonとスレッドの詳細については、次を参照してください。

于 2012-12-06T14:43:06.363 に答える