SplitterWindow reagiert nicht auf Event!

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Hallo liebe Community,
ich habe mal wieder ein Problem, was ich nicht gelöst bekomme.
Unten seht ihr meinen Code, es handelt sich hierbei um ein SplitterWindow sowie ein Panel links und ein Panel rechts. Soweit klappt auch alles, mein Ziel ist es, sobald sich die Größe des Frames ändert, das sich auch die Größe der Panel ändert bzw. die Position des Sash(Trennstrich) anpasst und in die Mitte gerückt wird. Ohne wx.EVT_SIZE funktioniert alles aber sobald ich es an das Frame binde, verkleinert sich die Größe von panel1. Was kann das sein? Habt ihr eine Idee?

MfG Schaf220

Code: Alles auswählen

#!/usr/bin/python

import wx

class SizeEvent(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)

        #self.Bind(wx.EVT_SIZE, self.OnSize) # Wenn diese Zeile auskommentiert wird, geht das Programm
                                             # Wenn nicht, ist das Fenster für Panel 1 ganz klein und bleibt auch so

        splitter = wx.SplitterWindow(self, -1, style = wx.SIMPLE_BORDER)
        
        self.panel1 = wx.Panel(splitter, -1)
        self.panel2 = wx.Panel(splitter, -1)
        self.panel1.SetBackgroundColour(wx.RED)
        
        splitter.SplitVertically(self.panel1, self.panel2, self.GetSize()[0]/2)
        
        self.Centre()
        self.Show(True)
        
    def OnSize(self, event):
        actSize = event.GetSize()
        xPos = int(actSize[0])
        yPos = int(actSize[1])
        #print yPos, type(yPos)
        self.panel1.SetSize(wx.Size(xPos/2,yPos)) # soll Groesse des Panels richten
        


app = wx.App()
SizeEvent(None, 1, 'sizeevent.py')
app.MainLoop()
Zuletzt geändert von Schaf220 am Samstag 2. Oktober 2010, 15:53, insgesamt 1-mal geändert.
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Hi,
folgender Code tut, was du vermutlich möchtest:

Code: Alles auswählen

    def OnSize(self, event):
        self.splitter.SetSashPosition(event.GetSize()[0]/2)
        event.Skip()
Die Breiten der Panels werden vom SplitterWindow gemanagt. Deshalb kannst du die nicht direkt verändern und musst dem SplitterWindow sagen, welche Aufteilung du möchtest.

Ausserdem (hat jetzt nichts mit deinem Problem zu tun):
- bitte formatiere künftig deinen Code mit python-tags
- eine id musst du beim Erzeugen eines Widgets nur dann angeben, wenn sie vom Standardwert abweicht
- actSize ist überflüssig: width,height = event.GetSize()
- xPos und yPos sind keine gute Bezeichner für Breite und Höhe eines Fensters
- eine explizite Umwandlung von int nach int ist i.d.R. unnötig ;-)

Gruß
Norbert
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Vielen Dank für deine Hilfe und deine Verbesserungsvorschläge!
Antworten