effizienz-/stilfrage

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

effizienz-/stilfrage

Beitragvon nkoehring » Dienstag 11. September 2007, 00:58

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()
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Dienstag 11. September 2007, 08:07

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:

Beitragvon nkoehring » Donnerstag 13. September 2007, 01:29

Also meinst du, klassengebundene GUIs sind merksam schneller?
Das ist halt die Frage...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: effizienz-/stilfrage

Beitragvon gerold » Donnerstag 13. September 2007, 09:44

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:

Beitragvon CM » Donnerstag 13. September 2007, 10:15

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 13. September 2007, 11:12

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder