Ein eigener EventLoop, was ist besser?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Hallo,

ich brauche eine ShowModal() Methode für ein wx.MiniFrame. Nachdem es diese noch nicht gibt, hab ich sie kurzerhand selbst versucht umzusetzen. Funktioniert auch wunderbar, aber währenddessen bin ich auf verschiedene Varianten gestoßen wie ich den EventLoop umsetzen könnte. Nun meine Frage: Welche Variante ist besser? Gibt es irgendwelche Nach- Vorteile von A, B oder C? Auch wenn ich mich noch nicht so 100%ig mit den wxEvents auskenne, tendiere ich zu C. In Ordnung?
Oder ist das vielleicht viel zu kompliziert und es gibt eine bessere Lösung als einen eigenen EventLoop? (Auf die Sache mit dem EventLoop bin ich über die Quelldateien von wxPython gekommen (\src\msw\dialog.cpp) und folgendes Beispiel: http://www.gamedev.net/community/forums ... 1&#3482738)

Wie schon gesagt, funktionieren tut es, auch die Aktualisierung des MainFrames klappt wunderbar (Zumindest mit Variante C). Aber da ich mich eben nicht so gut mit Events auskenne, kann ich auch überhaupt nicht einschätzen was für Seiteneffekte auftreten könnten, deshalb meine Fragen.

A:

Code: Alles auswählen

class MyMini(wx.MiniFrame):
    def __init__(self, *args, **kwargs):
        wx.MiniFrame.__init__(self, *args, **kwargs)
        self.Bind(wx.EVT_CLOSE, self.on_close)
    
    def on_close(self, event):
        self.end_modal(1)
        self.Destroy()
    
    def end_modal(self, code):
        self.return_code = code
        self.event_loop.Exit()
    
    def show_modal(self):
        self.Show()
        self.MakeModal()
        self.return_code = None
        
        self.event_loop = wx.EventLoop()
        
        self.event_loop.Run()
        while self.event_loop.IsRunning():
            pass
        
        self.MakeModal(False)
        return self.return_code
B:

Code: Alles auswählen

class MyMini(wx.MiniFrame):
    def __init__(self, *args, **kwargs):
        wx.MiniFrame.__init__(self, *args, **kwargs)
        self.Bind(wx.EVT_CLOSE, self.on_close)
    
    def on_close(self, event):
        self.end_modal(1)
        self.Destroy()
    
    def end_modal(self, code):
        self.return_code = code
        self.event_loop.Exit()
    
    def show_modal(self):
        self.Show()
        self.MakeModal()
        self.return_code = None
        
        self.event_loop = wx.EventLoop()
        
        self.event_loop.Run()
        while self.event_loop.IsRunning():
            if self.event_loop.Pending():
                self.event_loop.Dispatch()
        
        self.MakeModal(False)
        return self.return_code
C:

Code: Alles auswählen

class MyMini(wx.MiniFrame):
    def __init__(self, *args, **kwargs):
        wx.MiniFrame.__init__(self, *args, **kwargs)
        self.Bind(wx.EVT_CLOSE, self.on_close)
    
    def on_close(self, event):
        self.end_modal(1)
        self.Destroy()
    
    def end_modal(self, code):
        self.return_code = code
    
    def show_modal(self):
        self.Show()
        self.MakeModal()
        self.return_code = None
        
        self.event_loop = wx.EventLoop()
        old_loop = wx.EventLoop.GetActive()
        wx.EventLoop.SetActive(self.event_loop)
        
        while self.event_loop.IsRunning() and self.return_code is None:
            if self.event_loop.Pending():
                self.event_loop.Dispatch()
        
        wx.EventLoop.SetActive(old_loop)
        self.MakeModal(False)
        return self.return_code
Antworten