Anfängerfehler?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
meinereins
User
Beiträge: 7
Registriert: Freitag 18. März 2011, 10:41

Hallo zusammen,

ich hab grad begonnen, mit den wx-Demos rumzuspielen. Mein Ziel ist, die AUI_Notebook.py
standalone (also auch ohne run.py) zum Laufen zu bringen, um daraus dann nach und nach
eine eigene Anwendung abzuleiten. Offensichtlich hab ich noch Verständnisprobleme.

Mein Code:

Code: Alles auswählen

import wx
import wx.aui

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "My Frame", size=(600, 300))
        panel = wx.Panel(self, -1)

        nb = wx.aui.AuiNotebook(panel)
        page = wx.TextCtrl(nb, -1, "text", style=wx.TE_MULTILINE)
        nb.AddPage(page, "Welcome")

        for num in range(1, 5):
            page = wx.TextCtrl(nb, -1, "This is page %d" % num ,
                               style=wx.TE_MULTILINE)
            nb.AddPage(page, "Tab Number %d" % num)
            
        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        self.SetSizer(sizer)

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show(True)
    app.MainLoop()
Das liefert ein graues Fenster, vom Notebook ist aber nur ein ca. 25x25 Pixel kleines
Quadrat im linken oberen Eck zu sehen. Fehlt hier noch irgendeine Refresh() oder
Show() methode?

Vielen Dank für Eure Geduld
meinereins
BlackJack

@meinereins: Du hast je nach Betrachtungsweise ein Widget zu viel oder einen Sizer zu wenig. Auf jeden Fall ist es falsch das `Panel` in den `Frame` zu stecken, das `AuiNotebook` in das `Panel`, dann aber das Notebook mit einem Sizer auf dem `Frame` zu „layouten“ und dabei das `Panel` einfach zu „überspringen“. Sizer sollten schon zur Verschachtelungshierarchie der Widgets passen.
meinereins
User
Beiträge: 7
Registriert: Freitag 18. März 2011, 10:41

@BlackJack:
vielen Dank für die Antwort. Jetzt hab ichs.
Die Verschachtelung "Notebook in Panel in Frame" war durchaus gewollt, da ich
gelesen habe, immer ein Panel zu benutzen und nie die Widgets (hier das notebook)
direkt auf den Frame zu setzen.
Aber auf den sizer hatte ich nicht geachtet. Richtig:

Code: Alles auswählen

panel.SetSizer(sizer)
weil self bezieht sich ja auf den MyFrame...
Danke!
meinereins
Antworten