alan hat geschrieben:Wieso funktioniert mein obiger Code, wenn man in MyFrame ab Zeile 14 den zweiten Splitter + panels löscht?
[...]
Dann wird "Vsplitter" mit maximaler Länge dargestellt, obwohl kein Sizer verwendet wurde.
Hallo alan!
Das ist eine Ausnahme!
Wenn in einem Frame nur ein einziges Objekt liegt, dann wird dieses Objekt automatisch auf die volle Framegröße vergrößert.
Da in den allermeisten Fällen ein Panel als Hauptcontainer innerhalb des Frames liegt, wird dieses Panel sofort gleich groß wie das Frame (genauer gesagt wie die ClientSize). Man spart sich somit, bei jedem Programm/Fenster den Sizer für das obligatorische Panel und der Programmierer spart sich die zugehörige Tipparbeit.
Sobald noch ein zweites Objekt in das Frame gelegt wird, ist dieser Effekt weg.
EDIT:
Wie man in diesem Beispiel sieht, wird der Button auf die volle ClientSize aufgeblasen:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import wx
wx.SetDefaultPyEncoding("iso-8859-15")
class MyFrame(wx.Frame):
def __init__(
self, parent = None, title = "Example", size = wx.Size(550, 420)
):
wx.Frame.__init__(self, parent, -1, title, size = size)
button = wx.Button(self, label = "Ich bin der Button")
def main():
"""Testing"""
app = wx.PySimpleApp()
f = MyFrame()
f.Center()
f.Show()
app.MainLoop()
if __name__ == "__main__":
main()
In diesem Beispiel sieht man sofort, dass der Effekt weg ist, sobald ein zweiter Button in das Frame gelegt wird:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import wx
wx.SetDefaultPyEncoding("iso-8859-15")
class MyFrame(wx.Frame):
def __init__(
self, parent = None, title = "Example", size = wx.Size(550, 420)
):
wx.Frame.__init__(self, parent, -1, title, size = size)
button1 = wx.Button(self, label = "Ich bin der erste Button")
button2 = wx.Button(self, label = "Ich bin der zweite Button..........")
self.Center()
def main():
"""Testing"""
app = wx.PySimpleApp()
f = MyFrame()
f.Show()
app.MainLoop()
if __name__ == "__main__":
main()
EDIT2:
Und so funktioniert es mit mehreren Buttons richtig:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import wx
wx.SetDefaultPyEncoding("iso-8859-15")
class MyFrame(wx.Frame):
def __init__(
self, parent = None, title = "Example", size = wx.Size(550, 420)
):
wx.Frame.__init__(self, parent, -1, title, size = size)
# Diese Panel füllt automatisch den kompletten Platz aus, da es das einzige
# Objekt innerhalb des Frames ist. !!! Lege nie ein Widget direkt in ein
# Frame. Lege die Widgets immer auf ein Panel. Damit wird sicher gestellt,
# dass sich die Widgets in jedem Betriebssystem wie gewohnt verhalten. Z.B.
# kann man dann mit der TAB-Taste von einem Widget zum nächsten springen.
panel = wx.Panel(self)
# Äußere Box
vbox_outer = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox_outer)
# Innere Box mit 5 px Abstand zum Rand
vbox_inner = wx.BoxSizer(wx.VERTICAL)
vbox_outer.Add(vbox_inner, 1, wx.ALL | wx.EXPAND, 5)
# Button1
button1 = wx.Button(panel, label = "Ich bin der erste Button")
vbox_inner.Add(button1, 1, wx.ALL | wx.EXPAND, 5)
# Button2
button2 = wx.Button(panel, label = "Ich bin der zweite Button..........")
vbox_inner.Add(button2, 1, wx.ALL | wx.EXPAND, 5)
self.Center()
def main():
"""Testing"""
app = wx.PySimpleApp()
f = MyFrame()
f.Show()
app.MainLoop()
if __name__ == "__main__":
main()
mfg
Gerold
