wxPython while loop beenden

BaseBallBatBoy

Erfahrenes Mitglied
Hi!

Ich hab ein kleines GUI erstellt mit zwei Buttons. Beim Klick auf Start soll das Programm einen while loop durchlaufen, welcher mit dem Stop Button beendet werden kann (das Ganze ist erst ein Test. Später kommt dann auch Sinnvolleres in den loop..).

GUI.py
PHP:
import wx, re, os, time

#global vars
running = True

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, pos=wx.DefaultPosition, size=(280, 200)):
        wx.Frame.__init__(self, parent, id, title, pos, size)

        self.CreateStatusBar()
        
        panel = wx.Panel(self)
        
        sizer = wx.GridBagSizer(vgap=5, hgap=5)
        bt = wx.Button(panel, 0, "Start", wx.DefaultPosition, wx.DefaultSize)
        sizer.Add(bt, pos=(1,1), span=(1,2), flag=wx.EXPAND) 
        bt = wx.Button(panel, 1, "Stop", wx.DefaultPosition, wx.DefaultSize)
        sizer.Add(bt, pos=(1,3), span=(1,2), flag=wx.EXPAND) 
        
        panel.SetSizer(sizer)
        panel.Layout()

        self.Bind(wx.EVT_BUTTON, self.OnStart, id=0)
        self.Bind(wx.EVT_BUTTON, self.OnStop, id=1)
        

    def OnStart(self, event):
            self.SetStatusText("Beginning loop")
            
            global running
            while running:
                print "Hallo"
   

    def OnStop(self, event):
        global running
        running = False
        self.SetStatusText("Job has been aborted")


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(parent=None, id=-1, title="simple gui")
        self.SetTopWindow(frame)
        frame.Show(True)
        return True


if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

Also, hat jemand eine Idee wie ich beim Klick auf den Stop Button aus dem 'endless' loop rauskomme? Ich hab nämlich das gefühl, dass der loop zur überlastung führt und das Programm danach auf gar keine Eingaben mehr reagiert.. Ich brauche aber leider einen endless loop der nur auf eine Useraktion beendet werden soll.
 
Hi.

Du kannst in einer Ereignisbehandlungsroutine keine Endlosschleife reinsetzen, da dann natürlich keine anderen Ereignisse mehr abgearbeitet werden können.

Entweder du integrierst deine Endlosschleife in die Endlosschleife von wxPython oder du verwendest einen Thread.

Gruß
 
Hi.

Das thread Modul ist relativ Low-Level. Für deine Anwendung solltest du lieber das threading Modul und die Thread Klasse vorziehen.

Bsp:
Python:
import threading, time

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

        self.goforit = True

        print "initialized."

    def run(self):
        while self.goforit:
            time.sleep(.5)
            print "Hello."

    def stop(self):
        self.goforit = False


if __name__ == "__main__":
    t = MyThread()

    t.start()
    try:
        for i in range(10):
            print i
            time.sleep(1);

    finally:
        t.stop()
        t.join()
Gruß
 
Zurück