Problem mit Sizern

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sacro_thaan
User
Beiträge: 12
Registriert: Montag 23. Januar 2006, 03:21

Hi,

nachdem ich schon einige Zeit mitlese, und schon so manche Frage beantwortet wurde, brauche ich jetzt mal konkretere Hilfe.

Ich habe folgendes Problem. Ich habe ein Fenster mit zwei Tabellen (hier im Come mal durch Text-Felder ersetzt). Die obere ist lang und schmal, die untere kurz und breit. Also habe ich mit FlexGridSizern folgendes zusammengebaut.

Code: Alles auswählen

from wxPython.wx import *

class MainFrame(wxFrame):
    def __init__(self, parent, ID, title):
        self.app = parent
        wxFrame.__init__(self, None, ID, title, style = wxCAPTION|\
                         wxCLOSE_BOX|wxMINIMIZE_BOX|wxMAXIMIZE_BOX|\
                         wxSYSTEM_MENU|wxFULL_REPAINT_ON_RESIZE|\
                         wxCLIP_CHILDREN|wxRESIZE_BORDER)

        self.panel = wxPanel(self, -1,
                             style =     wxTAB_TRAVERSAL|wxFULL_REPAINT_ON_RESIZE)

        self.textctrl1 = wxTextCtrl(self.panel, -1, "My text 1.",
                                   wxDefaultPosition, wxSize(200,300),
                                   wxTE_MULTILINE)
        self.textctrl2 = wxTextCtrl(self.panel, -1, "My text 2.",
                                   wxDefaultPosition, wxSize(200,150),
                                   wxTE_MULTILINE)

        self.button1 = wxButton(self.panel, -1, "Dummy1")
        self.button2 = wxButton(self.panel, -1, "Dummy2")
        self.button3 = wxButton(self.panel, -1, "Dummy3")
        self.button4 = wxButton(self.panel, -1, "Dummy4")
        self.button5 = wxButton(self.panel, -1, "Dummy5")
        self.button6 = wxButton(self.panel, -1, "Dummy6")

        self.__do_layout()

    def __do_layout(self):

        sizer_top = wxBoxSizer(wxVERTICAL)
        sizer_panel = wxFlexGridSizer(2, 1, 5, 5)
        #sizer_panel = wxBoxSizer(wxVERTICAL)
        staticbox_1 = wxStaticBox(self.panel, -1, "Text1")
        staticboxsizer_1 = wxStaticBoxSizer(staticbox_1, wxVERTICAL)

        staticbox_2 = wxStaticBox(self.panel, -1, "Text2")
        staticboxsizer_2 = wxStaticBoxSizer(staticbox_2, wxVERTICAL)

        button_sizer_1 = wxBoxSizer(wxHORIZONTAL)
        button_sizer_2 = wxBoxSizer(wxHORIZONTAL)

        button_sizer_1.Add(self.button1, 0, wxALL, 5)
        button_sizer_1.Add(self.button2, 0, wxALL, 5)

        button_sizer_2.Add(self.button3, 0, wxALL, 5)
        button_sizer_2.Add(self.button4, 0, wxALL, 5)
        button_sizer_2.Add(self.button5, 0, wxALL, 5)
        button_sizer_2.Add(self.button6, 0, wxALL, 5)

        staticboxsizer_1.Add(self.textctrl1, 1, wxEXPAND|wxALL, 0)
        staticboxsizer_1.Add(button_sizer_1, 0, wxALIGN_CENTER )

        staticboxsizer_2.Add(self.textctrl2, 1, wxEXPAND|wxALL, 0)
        staticboxsizer_2.Add(button_sizer_2, 0, wxALIGN_CENTER )

        sizer_panel.Add(staticboxsizer_1, 1, wxEXPAND|wxALL, 0)
        sizer_panel.Add(staticboxsizer_2, 1, wxEXPAND|wxALL, 0)

        self.panel.SetAutoLayout(True)
        self.panel.SetSizer(sizer_panel)

        sizer_panel.Fit(self.panel)
        sizer_panel.SetSizeHints(self.panel)

        sizer_top.Add(self.panel, 1, wxEXPAND, 0)

        self.SetAutoLayout(True)
        self.SetSizer(sizer_top)

        sizer_top.Fit(self)
        sizer_top.SetSizeHints(self)

        self.Layout()

class Application(wxApp):
    def OnInit(self):
        frame = MainFrame(self, -1, "MainFrame")
        frame.Show(true)
        self.SetTopWindow(frame)	
        return True


def main():
    app = Application(0)
    app.MainLoop()

	
if __name__ == "__main__":
    main()
	
Wenn ich nun aber die Größe der Fensters ändere (durch Ziehen oder Maximieren), wachsen die Elemente nicht mit. Wenn ich einen BoxSizer verwende (im Code die auskommentierte Zeile mit der darüberstehenden austauschen), dann passen sich die Elemente der Febstergröße an, aber das Layout ist sehr unvorteilhaft, da die untere Tabelle zu viel Platz einnimmt.

Nun zu meiner Frage: Ist es irgendwie möglich, die FlexGridSizer dazu zu überreden mitzuwachsen? In der Doku steht was von wxFlexGridSizer::SetFlexibleDirection, aber wenn ich die Zeile "sizer_panel.SetFlexibleDirection(wxBOTH)" einfüge, ändert das nichts am Verhalten. Muss ich da noch mit den Resize-Events arbeiten? Und wenn ja, hat da jeman Beispielcode?

Ach ja, ich arbeite mit Enhanced Python Distribution - Python 2.3.5 for Windows (Enthought Edition) mit wxPython 2.6.1.0

Gruß

Till
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Nach einigem Probieren bin ich draufgekommen:

Nach dem Befehl:

Code: Alles auswählen

self.panel.SetSizer(sizer_panel)
habe ich eingefügt:

Code: Alles auswählen

sizer_panel.AddGrowableCol(0)
sizer_panel.AddGrowableRow(0)
Damit sollte es funktionieren.

BTW: schönes Sample und es ist sehr erfreulich, wenn jemand
gleich ein vollständig, lauffähiges Demoprogramm mitliefert. :)

BTW: Wieder einmal: :)

Seit 2.5 ist es üblich, den neuen Namespace zu verwenden:

import wx
wx.Frame, ...


Vielleicht lässt mich einer der Moderatoren das und einige andere
Sachen in einem Sticky oder newuser Thread das einmal hineinschreiben.
Am besten in den "VOR dem Posten lesen".
sacro_thaan
User
Beiträge: 12
Registriert: Montag 23. Januar 2006, 03:21

Hallo Francesco,

danke, danke, DANKE :D

Ich war schon am verzweifeln. Sei gestern sitze ich daran, habe mich durch die Doku, Foren und alles, was ich gefunden habe durchgequält, aber geholfen hatte bisher nichts. Jetzt klappt es :D

Wie kommt man auf sowas, oder habe ich vor lauter Betriebsblindheit mal wieder den Wald vor lauter Bäumen nicht gesehen?

Ach ja: Danke für das Lob wg. dem Code. Hab mir Mühe gegeben :D

Gruß

Till
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

sacro_thaan hat geschrieben:Hallo Francesco,

danke, danke, DANKE :D

Ich war schon am verzweifeln. Sei gestern sitze ich daran, habe mich durch die Doku, Foren und alles, was ich gefunden habe durchgequält, aber geholfen hatte bisher nichts. Jetzt klappt es :D
Bitte! *freu*.

sacro_thaan hat geschrieben: Wie kommt man auf sowas, oder habe ich vor lauter Betriebsblindheit mal wieder den Wald vor lauter Bäumen nicht gesehen?
Nein, glaube ich nicht.
Hätte wahrscheinlich auch lange gesucht.

Ich lese regelmäßig die wxPython-user-Mailing List, durchsuche
sie bei Gelegenheit auf bestimmte Begriffe, sammle richtiggehend
wxPython Source Code und habe PyCrust gepatcht.

In (meinem gepatchten) PyCrust habe ich eine Funktion AutoCompManager, der mir wie das Autocomplete alle Methoden zeigt.

Ausserdem auch die "non-derived", das heisst, die, die nur in
Flexgridsizer vorkommen.
sacro_thaan hat geschrieben: Ach ja: Danke für das Lob wg. dem Code. Hab mir Mühe gegeben :D

Gruß

Till
Das freut mich wirklich, wenn sich jemand da ein bisschen Mühe gibt.
Man kann man das jeweilige Programm direkt ausprobieren,
was umso mehr motiviert (weil man nicht umständlich selber was
zusammenstricken musse), um eine Lösung zu finden.

Ciao
Antworten