GUI programmieren, benötige Hilfe

Plattformunabhängige GUIs mit wxWidgets.
Antworten
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Freitag 18. August 2006, 22:00

Hallo,

ich bekomme es einfach nicht hin.
Das Ergebniss soll ungefähr so aussehen.

Mein Code sieht so aus

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx

class ateMainFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(400,300))
        self.mainpanel = ateMainPanel(self,-1)
        self.CreateStatusBar()
        self.GetStatusBar().SetFieldsCount(2)
        
class ateMainPanel(wx.Panel):
    def __init__(self,parent,id):
        wx.Panel.__init__(self,parent,id,(-1,-1))
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox_l = wx.BoxSizer(wx.VERTICAL)
        vbox_r = wx.BoxSizer(wx.VERTICAL)
        t = wx.StaticText(self,-1,"Dat is ein Text")
        t1 = wx.StaticText(self,-1,"Dat is ein Text")
        t2 = wx.StaticText(self,-1,"Dat is ein Text")
        
        box = wx.StaticBox(self, -1, "box")
        bsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
        border = wx.BoxSizer()
        box.SetSize((380,80))
        border.Add(bsizer, 1, wx.EXPAND|wx.ALL, 25)
        bsizer.Add(t, 0, wx.TOP|wx.LEFT, 10)
        
        box1 = wx.StaticBox(self, -1, "box1")
        bsizer1 = wx.StaticBoxSizer(box1, wx.VERTICAL)
        border1 = wx.BoxSizer()
        border1.Add(bsizer1, 1, wx.EXPAND|wx.ALL, 100)
        bsizer1.Add(t1, 0, wx.TOP|wx.LEFT, 10)
        
        box2 = wx.StaticBox(self, -1, "box2")
        bsizer2 = wx.StaticBoxSizer(box2, wx.VERTICAL)
        border2 = wx.BoxSizer()
        border2.Add(bsizer2, 1, wx.EXPAND|wx.ALL, 25)
        bsizer2.Add(t2, 0, wx.TOP|wx.LEFT, 10)
        
        vbox_l.Add(border,0, wx.EXPAND)
        vbox_l.Add(border1,0, wx.EXPAND)
        vbox_r.Add(border2,0, wx.EXPAND)
        hbox.Add(vbox_l,0, wx.EXPAND)
        hbox.Add(vbox_r,0, wx.EXPAND)
        self.SetSizer(hbox)

class ateNotebook(wx.Notebook):
    def __init__(self,parent,id):
        wx.Notebook.__init__(self,parent,id)
        

class ATE (wx.App):
     def OnInit(self):
         frame = ateMainFrame(None, -1, 'Titel')
          
        
         frame.Show(True)
         return True

if __name__ == '__main__':
    app = ATE(0)
    app.MainLoop()
Ich bräuchte einen Schubs in die richtige Richtung, einen Link zu soetwas ähnlichem und/oder nen Tip, wie ich zu dem gewünschten Ergebnis komme.

Vielen Dank für die Aufmerksamkeit. 8)
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

Samstag 19. August 2006, 09:12

mach es einfach mit wxglade

ich benutze wxglade und spe als editor

ist einfach super
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Samstag 19. August 2006, 09:43

wxGlade gefällt mir nicht, außerdem möchte ich das Programm "per Hand" schreiben (wegen dem Lerneffekt).
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 19. August 2006, 14:06

Hi!

Hier ein kleines Beispiel. Allerdings ist es kaum möglich, im Panel ``LeftBottomPanel`` die Boxen exakt unter die gewünschten Spalten zu stellen. Da würde ich eher das ``FlexGrid`` innerhalb des Panels ``LeftTopPanel`` so erweitern, dass die Boxen unterhalb angezeigt werden. Allerdings müsstest du dann auf die verschiedenen Farben, die derzeit unter den Feldern liegen, verzichten. Was aber ein geringer Preis dafür ist.

Ich habe jetzt drei Stunden herumprobiert um herauszufinden, wie man am Besten die Spalten, in zwei verschiedenen Panels, untereinander ausrichten könnte. Dabei habe ich mindestens vier verschiedene Wege (über Timer, über eigene Events, über Eventweiterleitung, mit Sizer, ohne Sizer, usw.) ausprobiert und nichts hat so funktioniert, dass ich es jemandem raten könnte.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx 


class MyFrame(wx.Frame):
    """
    Hauptframe
    """
    
    def __init__(self, parent = None, id = -1, title = "Hauptframe"):
        """
        Initialisiert das Frame und baut es auf
        """
        
        wx.Frame.__init__(self, parent, id, title)
        
        # Panel
        panel = wx.Panel(self)
        
        # Haupt-Sizer
        gbag = wx.GridBagSizer(vgap = 2, hgap = 2)
        gbag.AddGrowableCol(0)
        gbag.AddGrowableCol(1)
        gbag.AddGrowableRow(0)
        gbag.AddGrowableRow(1)
        panel.SetSizer(gbag)
        
        # LeftTopPanel
        left_top_panel = LeftTopPanel(panel)
        gbag.Add(item = left_top_panel, pos = (0, 0), flag = wx.EXPAND)
        
        # LeftBottomPanel
        left_bottom_panel = LeftBottomPanel(panel)
        gbag.Add(item = left_bottom_panel, pos = (1, 0), flag = wx.EXPAND)
        
        # RightPanel
        right_panel = RightPanel(panel)
        gbag.Add(item = right_panel, pos = (0, 1), span = (2, 1), flag = wx.EXPAND)
        
        # Zentrieren und anzeigen
        if parent:
            self.CenterOnParent(parent)
        else:
            self.Center()
        self.Show()
        
        # ** auf das Mindestmaß verkleinern**
        # Dazu wird zuerst das Panel auf das Minimum verkleinert.
        panel.Fit()
        # Dann wird die ClientSize des Frames an die Größe des Panels angepasst
        self.SetClientSize(panel.GetSizeTuple())
        # Danach noch die Mindestgröße des Frames auf die aktuelle Größe des Frames setzen.
        self.SetSizeHintsSz(self.GetSizeTuple())



class LeftTopPanel(wx.Panel):
    """
    Panel, welches links oben angezeigt wird.
    """
    
    def __init__(self, parent = None):
        """
        Initialisiert das Panel
        """
        
        wx.Panel.__init__(self, parent)
        
        self.SetBackgroundColour("blue")
        
        # VBox (für den äußeren Abstand)
        vbox_out = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox_out)
        
        # Panel
        panel = wx.Panel(self)
        panel.SetBackgroundColour("#ccddee")
        vbox_out.Add(item = panel, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 10)
        
        # VBox (für den inneren Abstand)
        vbox_in = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_in)
        
        # FlexGrid
        fgrid = wx.FlexGridSizer(rows = 4, cols = 4, vgap = 5, hgap = 5)
        self.fgrid = fgrid # veröffentlichen, um als Referenz-Sizer dienen zu können
        for i in range(1, 4):
            fgrid.AddGrowableCol(i)
            fgrid.AddGrowableRow(i)
        vbox_in.Add(fgrid, 1, flag = wx.ALL | wx.EXPAND, border = 5)
        
        # **Erste Zeile**
        
        # Leerzelle
        fgrid.Add(item = (0, 0))
        
        # Montag
        fgrid.Add(wx.StaticText(panel, -1, label = "Montag"), flag = wx.ALIGN_CENTER_VERTICAL)
        
        # ...
        fgrid.Add(wx.StaticText(panel, -1, label = "..."), flag = wx.ALIGN_CENTER_VERTICAL)
        
        # Sonntag
        fgrid.Add(wx.StaticText(panel, -1, label = "Sonntag"), flag = wx.ALIGN_CENTER_VERTICAL)
        
        # **Zweite Zeile**
        
        # Vormittag
        fgrid.Add(wx.StaticText(panel, -1, label = "Vormittag"), flag = wx.ALIGN_CENTER_VERTICAL)
        
        # Montag
        choices = ("Hallo", "Welt")
        ch_vormittag_montag = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_vormittag_montag, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # ...
        choices = ("Hallo", "Welt")
        ch_vormittag_punktpunkt = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_vormittag_punktpunkt, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # Sonntag
        choices = ("Hallo", "Welt")
        ch_vormittag_sonntag = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_vormittag_sonntag, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # **Dritte Zeile**
        
        # Mittag
        fgrid.Add(wx.StaticText(panel, -1, label = "Mittag"), flag = wx.ALIGN_CENTER_VERTICAL)
        
        # Montag
        choices = ("Hallo", "Welt")
        ch_mittag_montag = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_mittag_montag, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # ...
        choices = ("Hallo", "Welt")
        ch_mittag_punktpunkt = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_mittag_punktpunkt, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # Sonntag
        choices = ("Hallo", "Welt")
        ch_mittag_sonntag = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_mittag_sonntag, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # **Vierte Zeile**
        
        # Nachmittag
        fgrid.Add(wx.StaticText(panel, -1, label = "Nachmittag"), flag = wx.ALIGN_CENTER_VERTICAL)
        
        # Montag
        choices = ("Hallo", "Welt")
        ch_nachmittag_montag = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_nachmittag_montag, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # ...
        choices = ("Hallo", "Welt")
        ch_nachmittag_punktpunkt = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_nachmittag_punktpunkt, flag = wx.ALIGN_CENTER_VERTICAL)
        
        # Sonntag
        choices = ("Hallo", "Welt")
        ch_nachmittag_sonntag = wx.Choice(panel, -1, choices = choices)
        fgrid.Add(ch_nachmittag_sonntag, flag = wx.ALIGN_CENTER_VERTICAL)



class LeftBottomPanel(wx.Panel):
    """
    Panel, welches links unten angezeigt wird.
    """
    
    def __init__(self, parent):
        """
        Initialisiert das Panel
        """
        
        wx.Panel.__init__(self, parent)
        
        self.SetBackgroundColour("red")



class RightPanel(wx.Panel):
    """
    Panel, welches rechts angezeigt wird.
    """
    
    def __init__(self, parent = None):
        """
        Initialisiert das Panel
        """
        
        wx.Panel.__init__(self, parent)
        
        self.SetBackgroundColour("yellow")


def main():
    """
    Hauptprozedur
    """
    
    app = wx.PySimpleApp()
    myframe = MyFrame()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Samstag 19. August 2006, 14:57

@Gerold:
3 Stunden? Das wäre wirklich nicht nötig gewesen, ein dickes Dankeschön dafür.
Jetzt beschäftige ich mich erstmal mit dem Code, mal sehen was draus wird.
Antworten