Sizer skalieren...

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Kann mir mal jemand helfen... Ich hab hier eine Dialog-Box mit vier Spalten:

1 - class="wxListCtrl" name="CDliste" max
2 - class="wxStaticText" name="CDname" min
3 - class="wxListCtrl" name="TitelListe" max
4 - class="wxBoxSizer" name="sizer_3" min

In der vierten Spalte sind in einem BoxSizer zwei Buttons enthalten.

Ich weiß einfach nicht wie ich die Proportionen jeden einzelnen Spalten setzten kann...
Ich hab mal hinter jeder Spalte geschrieben, wie ich sie gern hätte... Die TextCtrl
sollten halt möglichst groß werden...


Kann mir da mal jemand helfen???


EDIT: Falsche Beispiel gelöscht... :oops: Richtiges ist unten...
Zuletzt geändert von jens am Montag 6. Dezember 2004, 21:31, insgesamt 1-mal geändert.
Gast

Hi Jens,

solche Probleme finde ich auch immer ziemlich nervig. Aber Deines verstehe ich nicht: Wo steht denn im Code TextCtrl? Oder bin ich nur zu blind zum Finden? (Wäre mir ziemlich peinlich, aber mein Browser kann auch kein TextCtrl ausmachen. Wie bastelst Du Dir das denn zusammen?)

Gruß,
Christian
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ok, sorry... War das falsche Beispiel :oops:

Am besten vielleicht das Beispiel einfach in wxGlade laden... Ein erfahrener Bastler, sieht evtl. sofort was ich falsch gemacht hab...

Hier das richtige:

Code: Alles auswählen

<?xml version="1.0"?>
<!-- generated by wxGlade 0.3.5.1 on Mon Dec 06 17:16:54 2004 -->

<application path="GUI_einlesen.py" name="freeDBinfo_einlesen" class="MyApp" option="0" language="python" top_window="mainFrame" encoding="ISO-8859-1" use_gettext="0" overwrite="0" use_new_namespace="1">
    <object class="mainFrame" name="mainFrame" base="EditFrame">
        <style>wxDEFAULT_FRAME_STYLE</style>
        <title>HauptFrame</title>
        <menubar>1</menubar>
        <statusbar>1</statusbar>
        <size>350, 310d</size>
        <object class="wxMenuBar" name="mainFrame_menubar" base="EditMenuBar">
            <menus>
                <menu name="" label="hilfe">
                    <item>
                        <label>about</label>
                        <name>about_name</name>
                    </item>
                </menu>
            </menus>
        </object>
        <object class="wxStatusBar" name="mainFrame_statusbar" base="EditStatusBar">
            <fields>
                <field width="-1">mainFrame_statusbar</field>
            </fields>
        </object>
        <object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer">
            <orient>wxVERTICAL</orient>
            <object class="sizeritem">
                <flag>wxEXPAND</flag>
                <border>0</border>
                <option>1</option>
                <object class="wxPanel" name="mainPanel" base="EditPanel">
                    <style>wxTAB_TRAVERSAL</style>
                    <object class="wxBoxSizer" name="sizer_4" base="EditBoxSizer">
                        <orient>wxVERTICAL</orient>
                        <object class="sizeritem">
                            <flag>wxALL</flag>
                            <border>3</border>
                            <option>0</option>
                            <object class="wxStaticText" name="label_2" base="EditStaticText">
                                <attribute>1</attribute>
                                <label>Status:</label>
                            </object>
                        </object>
                        <object class="sizeritem">
                            <flag>wxALL|wxEXPAND</flag>
                            <border>3</border>
                            <option>0</option>
                            <object class="wxTextCtrl" name="info_textfeld" base="EditTextCtrl">
                                <style>wxTE_MULTILINE|wxTE_LINEWRAP</style>
                                <font>
                                    <size>8</size>
                                    <family>modern</family>
                                    <style>normal</style>
                                    <weight>normal</weight>
                                    <underlined>0</underlined>
                                    <face></face>
                                </font>
                                <size>539, 150d</size>
                            </object>
                        </object>
                        <object class="sizeritem">
                            <flag>wxEXPAND|wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
                            <border>0</border>
                            <option>1</option>
                            <object class="wxBoxSizer" name="sizer_5" base="EditBoxSizer">
                                <orient>wxHORIZONTAL</orient>
                                <object class="sizeritem">
                                    <flag>wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE</flag>
                                    <border>10</border>
                                    <option>0</option>
                                    <object class="wxButton" name="button_readCD" base="EditButton">
                                        <label>CD-ROM einlesen</label>
                                    </object>
                                </object>
                                <object class="sizeritem">
                                    <flag>wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE</flag>
                                    <border>3</border>
                                    <option>0</option>
                                    <object class="wxButton" name="button_DatenAnzeigen" base="EditButton">
                                        <label>eingelesene Daten-Anzeigen</label>
                                    </object>
                                </object>
                                <object class="sizeritem">
                                    <flag>wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE</flag>
                                    <border>10</border>
                                    <option>0</option>
                                    <object class="wxButton" name="button_putToSQL" base="EditButton">
                                        <label>in SQL-DB speichern</label>
                                    </object>
                                </object>
                                <object class="sizeritem">
                                    <flag>wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE</flag>
                                    <border>10</border>
                                    <option>0</option>
                                    <object class="wxButton" name="button_exit" base="EditButton">
                                        <label>exit</label>
                                    </object>
                                </object>
                            </object>
                        </object>
                    </object>
                </object>
            </object>
        </object>
    </object>
</application>
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi

sorry - hatte mich beim letzten Mal vergessen einzuloggen.

Dein Code sieht eigentlich völlig ok aus. Es gibt ein Bug mit wxExpand (u. U. funktioniert es nämlich nur in eine Richtung und nicht in beiden Richtungen, auch wenn man das will ;-)), aber das scheint nicht Dein Problem zu sein.

Wenn Du den Frame auf volle Größe bringen willst versuche einmal wxShowFullScreen im Frame.

Wenn Du, und das verstehe ich als das eigentliche Problem, einen Bereich groß gegenüber den anderen machen willst, versuche mal einen anderen Sizer. In Deinem Beispiel würde ich mal verschachtelte Gridbagsizer ausprobieren - und TextCtrl dann z. B. über mehrere Spalten. Ist ein bißchen aufwändiger als der BoxSizer, gibt aber wohl das gewünschte Ergebnis. Für das bessere Layout kannst Du dann z. B. für die Buttons horizontale BoxSizer in den Gridbagsizer einbauen.

Sorry, daß ich das nicht wxGlademäßig ausdrücken kann - das benutze ich nicht.

Ggf. würde ich mal die wxPython-Version aufrüsten. Aber vielleicht magst Du jetzt auch warten bis eine Python2.4 kompatible Version auftaucht ;-).

Gruß,
Christian
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Danke für deine Hilfe...

Wenn ich das jetzt richtig verstanden hab, sind bei Sizern jede "Zelle" immer gleich groß?!?!
Also man kann z.B. keine zwei Zellen im Verhältnis von 25% zu 75% skalieren lassen???
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Jens hat geschrieben:Also man kann z.B. keine zwei Zellen im Verhältnis von 25% zu 75% skalieren lassen
Na ja, wx ist ja kein html ;-). Aber Du kannst natürlich schon sagen, daß ein Bereich sich z. B. über drei Spalten erstrecken soll und ein anderer über einen. Das Resultat ist dasselbe.

Alternativ kannst Du auch beim BoxSizer bleiben und einen Block höher gewichten als einen anderen Block (siehe wxPython Demo Beispiel makesimpleBox5).
Nicht auszuschließen, daß auch noch andere Wege zum Ziel führen ...

Ganz ehrlich: Ich experimentiere jedes Mal eine Weile herum, bevor ich das passende Layout für etwas Neues habe.

Gruß,
Christian
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Jens hat geschrieben:Wenn ich das jetzt richtig verstanden hab, sind bei Sizern jede "Zelle" immer gleich groß?!?!
PS
Nein! Entschuldige, da habe ich mich nicht sehr treffend ausgedrückt.

Aus der Doku "The idea behind sizers":
It is based upon the idea of individual subwindows reporting their minimal required size and their ability to get stretched if the size of the parent window has changed. This will most often mean that the programmer does not set the start-up size of a dialog, the dialog will rather be assigned a sizer and this sizer will be queried about the recommended size. This sizer in turn will query its children (which can be normal windows, empty space or other sizers) so that a hierarchy of sizers can be constructed
Das ist jetzt wahrscheinlich Eulen nach Athen tragen, weil Du das schon weißt. Übersetzt so viel wie: Eine kleine Zelle wird über ihren Inhalt definiert. Eine größere Zelle ist ggf. die kleine Zelle mal Gewichtung oder die größe ihres Inhaltes. Aber Du hast Gelegenheit Dinge auch absolut vorzugeben oder anderweitig rumzufummeln.

Hoffe ich war jetzt nicht zu verwirrend.

Gruß,
Christian
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

CM hat geschrieben:Alternativ kannst Du auch beim BoxSizer bleiben und einen Block höher gewichten als einen anderen Block
Aha... Bei wxGlade steht der Wert der Gewichtung bei Layout/Option. Ist ja sehr sinnig benannt :(

Ok das funktioniert schon mal... Allerdings, wenn ich meiner Textbox eine zuhohe Gewichtung verpasse, verschwinden die Buttons... Ich dachte das könnte so nicht passieren, weil zumindest eine gewisse MIN-Größe eingehalten wird... Ist bei HTML zumindest so :)


Aber wie kann man ein Element in wxGlade über meherer Zellen laufen lassen???
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

jens hat geschrieben: Ok das funktioniert schon mal... Allerdings, wenn ich meiner Textbox eine zuhohe Gewichtung verpasse, verschwinden die Buttons... Ich dachte das könnte so nicht passieren, weil zumindest eine gewisse MIN-Größe eingehalten wird... Ist bei HTML zumindest so
Wie, was, wann, wo? Das dürfte nicht passieren, jedenfalls, wenn Du Deinen Code nicht noch anderswo wesentlich geändert hast.
Deine Buttons sind doch immer noch ein Element eines vertikal orientierten BoxSizers genau unter TextCtrl, oder? Was hast Du denn dem TextCtrl gesagt, bzw. dem Sizerelement?
jens hat geschrieben:Aber wie kann man ein Element in wxGlade über meherer Zellen laufen lassen???
Ohne wxGlade zu kennen: Wahrscheinlich gar nicht. Was ich meinte ist der GridBagSizer ... :oops: Sorry, in letzter Zeit (Streß!) laufen meine Mails, Postings etc unter "obfuscating enhanced". Ist ne dumme Entschuldigung aber wahr.

Gruß,
Christian
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich bin nochmal durchgegangen und alle Flags gelöscht, die nicht unbedinngt brauche...

Somit habe ich eigentlich nur meinem wxTextCtrl ein wxEXPAND flag gesetzt, damit es die volle Breite erhält...
Die Buttons habe ich mit wxALIGN_CENTER_HORIZONTAL wxALIGN_CENTER_VERTICAL "zentriert"...

Ansonsten hab ich eigentlich keine Flags gesetzt. Dennoch verschwinden die Buttons, wenn man das Fenster zu klein skaliert. Gibt es einen Flag den man setzten muß, damit sowas nicht passiert???


Hier normal einen auszug aus meiner XRC:

Code: Alles auswählen

    <object class="wxFrame" name="mainFrame" subclass="mainFrame">
        <style>wxDEFAULT_FRAME_STYLE</style>
        <size>350, 307d</size>
        <title>HauptFrame</title>
        <object class="wxMenuBar" name="mainFrame_menubar">
            <object class="wxMenu">
                <label>hilfe</label>
                <object class="wxMenuItem" name="about_name">
                    <label>about</label>
                </object>
            </object>
        </object>
        <object class="wxStatusBar" name="mainFrame_statusbar">
            <fields>1</fields>
            <widths>-1</widths>
        </object>
        <object class="wxBoxSizer">
            <orient>wxVERTICAL</orient>
            <object class="sizeritem">
                <option>1</option>
                <flag>wxEXPAND</flag>
                <object class="wxPanel" name="mainPanel">
                    <style>wxTAB_TRAVERSAL</style>
                    <object class="wxBoxSizer">
                        <orient>wxVERTICAL</orient>
                        <object class="sizeritem">
                            <border>3</border>
                            <object class="wxStaticText" name="label_2">
                                <label>Status:</label>
                            </object>
                        </object>
                        <object class="sizeritem">
                            <option>10</option>
                            <flag>wxEXPAND</flag>
                            <border>3</border>
                            <object class="wxTextCtrl" name="info_textfeld">
                                <style>wxTE_MULTILINE|wxTE_LINEWRAP</style>
                                <size>539, 150d</size>
                                <font>
                                    <style>normal</style>
                                    <family>modern</family>
                                    <weight>normal</weight>
                                    <underlined>0</underlined>
                                    <size>8</size>
                                </font>
                            </object>
                        </object>
                        <object class="sizeritem">
                            <option>1</option>
                            <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
                            <object class="wxBoxSizer">
                                <orient>wxHORIZONTAL</orient>
                                <object class="sizeritem">
                                    <border>10</border>
                                    <object class="wxButton" name="button_readCD">
                                        <label>CD-ROM einlesen</label>
                                    </object>
                                </object>
                                <object class="sizeritem">
                                    <border>3</border>
                                    <object class="wxButton" name="button_DatenAnzeigen">
                                        <label>eingelesene Daten-Anzeigen</label>
                                    </object>
                                </object>
                                <object class="sizeritem">
                                    <border>10</border>
                                    <object class="wxButton" name="button_putToSQL">
                                        <label>in SQL-DB speichern</label>
                                    </object>
                                </object>
                                <object class="sizeritem">
                                    <border>10</border>
                                    <object class="wxButton" name="button_exit">
                                        <label>exit</label>
                                    </object>
                                </object>
                            </object>
                        </object>
                    </object>
                </object>
            </object>
        </object>
    </object>
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi Jens,

ich kann nur raten: Du hast zwei BoxSizer, die vielleicht nicht richtig angesprochen werden (Objekte mit gleichen Namen, weil der Parser schläft?). Jedenfalls wenn ich eine ganz einfach Applikation mache:

Code: Alles auswählen

import wx

class mainFrame(wx.Frame):
	def __init__(self,parent,id,title):
		wx.Frame.__init__(self,None,-1,"Dein Frame")
		p = wx.Panel(self,-1)
		sizer = self.sizer = wx.BoxSizer(wx.VERTICAL)
		TextField = wx.TextCtrl(p,-1,"bla bla.\n\n",size=(539,150),style=wx.TE_MULTILINE)
		self.TextField = TextField
		sizer.Add(TextField,flag=wx.EXPAND)
		
		buttons = wx.BoxSizer(wx.HORIZONTAL)
		buttons.Add((10,-1),0)
		b = wx.Button(self,wx.ID_OK,"Okay")
		b.SetDefault()
		buttons.Add(b,0,wx.ALL,10)
		 buttons.Add(wx.Button(self,wx.ID_CANCEL,"Cancel"),0,wx.ALL,10)
		
		sizer.Add(buttons,wx.GROW|wx.ALL,25)
		self.Layout()
		
		p.SetSizerAndFit(sizer)
		
		self.SetClientSize(p.GetSize())
		
class TestApp(wx.App):
	def OnInit(self):
		frame = mainFrame(None,-1,"DeinFrame")
		frame.Show(True)
		self.SetTopWindow(frame)
		return True
		
app = TestApp(0)
app.MainLoop()
(mit wx 2.5.8), dann klappt alles reibungslos. Gut, an dem Layout kann man natürlich feilen ... ;-)

Vielleicht solltest Du Dich an die Macher von wxGlade wenden? Oder vielleicht ist auch der Punkt gekommen, wo die wx Mailingliste angerufen werden sollte?

Oder Du kannst zunächst einmal versuchen nach und nach Elemente zu dem Gerüst hier oben hinzuzupacken und schauen, wo das Problem auftritt.

Gruß,
Christian
Antworten