effizienz-/stilfrage

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hallo mal wieder...

ich wollte mal wissen, ob es wichtige Unterschiede bzw Dinge gibt, die man ueber den Unterschied zwischen folgenden beiden Arten in wxPython einen einfachen Frame zu erstellen, wissen sollte:

Variante 1:

Code: Alles auswählen

import wx

def init(frame):
    panel = wx.Panel(frame)
    panel.SetSize(frame.GetClientSize())
    x = wx.StaticText(panel, -1, "LaberRababer")
    x.SetPosition((50, 50))
    
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = wx.Frame(None, -1, "blub")
    frame.Center()
    frame.Show()
    init(frame)
    app.MainLoop()

Variante 2:

Code: Alles auswählen

import wx

class Frame(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)
        panel = wx.Panel(self)
        # diese Codezeile ist hier eigentlich unnoetig
        panel.SetSize(self.GetClientSize())
        x = wx.StaticText(panel, -1, "LaberRababer")
        x.SetPosition((50, 50))

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Frame(None, -1, "blub")
    frame.Center()
    frame.Show()
    app.MainLoop()
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Variante 3, abgeleitet von Variante 2 (direkter Paste aus einer Anwendung, daher die seltsamen Namen):

Code: Alles auswählen

class SAXSApp(wx.App):
    """
        initialize Mainloop
    """
    def OnInit(self):
        splash = SPlotSplash()
        splash.Show()
        # entspricht Variante 2:
        frame = SAXS_wx(None, -1, "SAXS Analysis")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = SAXSApp(0)
app.MainLoop()
Dabei optiere ich ganz klar für die Variante 2 und 3 im Regelfall. (Wobei ich nicht weiß, ob ich mit meiner Variante noch auf dem neuesten Stand bin.)
Ob ein Splash-Widget nötig ist, ist natürlich immer zu hinterfragen, aber den Mainframe als eigenständige Klasse zu haben, gibt bei größeren Anwendungen auf jeden Fall mehr Power.

Gruß,
Christian
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Also meinst du, klassengebundene GUIs sind merksam schneller?
Das ist halt die Frage...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo nkoehring!

Mach das mal bitte ohne Klassen nach und entscheide dann selbst, wie du programmieren möchtest.:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class ControlFrame(wx.Frame):
    
    def __init__(self, parent = None, title = u"Control Frame"):
        wx.Frame.__init__(self, parent, -1, title)
        
        app = wx.GetApp()
        self.app = app
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        hbox_buttons = wx.BoxSizer(wx.HORIZONTAL)
        vbox_main.Add(hbox_buttons, 1, wx.EXPAND | wx.ALL, 5)
        
        btn_left_frame = wx.Button(panel, label = u"Show Left Frame")
        btn_left_frame.Bind(wx.EVT_BUTTON, app.show_left_frame)
        hbox_buttons.Add(btn_left_frame, 0, wx.ALL, 5)
        
        btn_right_frame = wx.Button(panel, label = u"Show Right Frame")
        btn_right_frame.Bind(wx.EVT_BUTTON, app.show_right_frame)
        hbox_buttons.Add(btn_right_frame, 0, wx.ALL, 5)
        
        hbox_buttons.Add(wx.StaticLine(panel, style = wx.LI_VERTICAL), 0, wx.EXPAND | wx.ALL, 5)
        
        btn_arrange_left_frame = wx.Button(panel, label = u"Arrange Left Frame")
        hbox_buttons.Add(btn_arrange_left_frame, 0, wx.ALL, 5)
        btn_arrange_left_frame.Bind(wx.EVT_BUTTON, self.on_arrange_left_frame)
        
        btn_arrange_right_frame = wx.Button(panel, label = u"Arrange Right Frame")
        hbox_buttons.Add(btn_arrange_right_frame, 0, wx.ALL, 5)
        btn_arrange_right_frame.Bind(wx.EVT_BUTTON, self.on_arrange_right_frame)
        
        panel.Fit()
        self.Fit()
        self.Move((0, 0))
        self.SetSize((app.max_size.width, -1))
    
    
    def on_arrange_left_frame(self, event = None):
        try:
            self.app.left_frame.arrange()
        except AttributeError:
            pass
    
    
    def on_arrange_right_frame(self, event = None):
        try:
            self.app.right_frame.arrange()
        except AttributeError:
            pass


class LeftFrame(wx.Frame):

    def __init__(self, parent = None, title = u"Left Frame"):
        wx.Frame.__init__(self, parent, -1, title)
        
        app = wx.GetApp()
        self.app = app
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        vbox_content = wx.BoxSizer(wx.VERTICAL)
        vbox_main.Add(vbox_content, 1, wx.EXPAND | wx.ALL, 5)
        
        vbox_content.AddStretchSpacer()
        
        btn_right_frame = wx.Button(panel, label = u"Show Right Frame")
        vbox_content.Add(btn_right_frame, 0, wx.ALIGN_CENTER | wx.ALL, 5)
        btn_right_frame.Bind(wx.EVT_BUTTON, app.show_right_frame)
        
        vbox_content.AddStretchSpacer()
        
        btn_arrange = wx.Button(panel, label = u"Arrange Frame")
        vbox_content.Add(btn_arrange, 0, wx.ALIGN_CENTER | wx.ALL, 5)
        btn_arrange.Bind(wx.EVT_BUTTON, self.arrange)
        
        vbox_content.AddStretchSpacer()
    
    
    def arrange(self, event = None):
        control_frame = self.app.control_frame
        control_frame_size = control_frame.GetSize()
        control_frame_pos = control_frame.GetPosition()
        
        max_size = self.app.max_size
        
        self.Move((0, control_frame_pos.y + control_frame_size.height))
        self.SetSize(
            (
                max_size.width / 2, 
                max_size.height - control_frame_pos.y - control_frame_size.height
            )
        )


class RightFrame(wx.Frame):

    def __init__(self, parent = None, title = u"Right Frame"):
        wx.Frame.__init__(self, parent, -1, title)
        
        app = wx.GetApp()
        self.app = app
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        vbox_content = wx.BoxSizer(wx.VERTICAL)
        vbox_main.Add(vbox_content, 1, wx.EXPAND | wx.ALL, 5)
        
        vbox_content.AddStretchSpacer()
        
        btn_left_frame = wx.Button(panel, label = u"Show Left Frame")
        vbox_content.Add(btn_left_frame, 0, wx.ALIGN_CENTER | wx.ALL, 5)
        btn_left_frame.Bind(wx.EVT_BUTTON, app.show_left_frame)
        
        vbox_content.AddStretchSpacer()
        
        btn_arrange = wx.Button(panel, label = u"Arrange Frame")
        vbox_content.Add(btn_arrange, 0, wx.ALIGN_CENTER | wx.ALL, 5)
        btn_arrange.Bind(wx.EVT_BUTTON, self.arrange)
        
        vbox_content.AddStretchSpacer()
    
    
    def arrange(self, event = None):
        control_frame = self.app.control_frame
        control_frame_size = control_frame.GetSize()
        control_frame_pos = control_frame.GetPosition()
        
        max_size = self.app.max_size
        
        self.Move((max_size.width / 2 , control_frame_pos.y + control_frame_size.height))
        self.SetSize(
            (
                max_size.width / 2, 
                max_size.height - control_frame_pos.y - control_frame_size.height
            )
        )
    

class MyApp(wx.PySimpleApp):
    
    control_frame = None
    left_frame = None
    right_frame = None
    
    
    def OnInit(self):
        self.get_max_size()
        self.show_control_frame()
        
        return True
    
    
    def get_max_size(self):
        dummy_frame = wx.Frame(None)
        dummy_frame.Maximize()
        self.max_size = dummy_frame.GetSize()
        dummy_frame.Destroy()
    
    
    def show_control_frame(self):
        self.control_frame = ControlFrame()
        self.control_frame.Show()


    def show_left_frame(self, event = None):
        if not isinstance(self.left_frame, LeftFrame):
            self.left_frame = LeftFrame(self.control_frame)
        self.left_frame.Show()
        self.left_frame.SetFocus()


    def show_right_frame(self, event = None):
        if not isinstance(self.right_frame, RightFrame):
            self.right_frame = RightFrame(self.control_frame)
        self.right_frame.Show()
        self.right_frame.SetFocus()


def main():
    app = MyApp()
    app.MainLoop()


if __name__ == "__main__":
    main()
Und Ja! Dieser Code ist nur auf Windows mit *unten* angeordneter Taskbar optimiert. Für mehr fehlte mir die Zeit.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

nkoehring hat geschrieben:Also meinst du, klassengebundene GUIs sind merksam schneller?
Das ist halt die Frage...
Gerolds Kurzfassung bringt es auf den Punkt: Mit "mehr" Power meinte ich keineswegs die Geschwindigkeit der Applikation. ;-)
Überhaupt hängen meine GUIs nicht, weil wx so langsam ist, sondern, ggf. weil ich im Hintergrund rechne. Die Klassen brauche ich vor allem, um Übersicht zu halten. Alleine so etwas geht prinzipiell auch ohne einen Hauptframe/Kontrollframe, aber wie kann ich auf parent zugreifen, wenn ich das parent nicht in eine Klasse packe? (Ja, es geht, aber ...)

Gruß,
Christian
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

CM hat geschrieben:Gerolds Kurzfassung
Hallo Christian!

"Kurzfassung" war gut... :lol:

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten