Scrollbars sind weg nach resize?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Problem ist folgendes:
Ich habe auf einem Panel ein Grid. Diesem Grid kann ich Zeilen / Spalten hinzufügen oder wegnehmen. Solange ich das Frame nicht in der Größe verändere, werden automatisch die Scrollbars für das Grid angezeigt.
Warum werden die Scrollbars nach einem EVT_SIZE nicht mehr angezeigt?

App.py

Code: Alles auswählen

#!/usr/bin/env python
#Boa:App:BoaApp
import wx
import Frame1
modules ={'Frame1': [1, 'Main frame of Application', u'Frame1.py']}

class BoaApp(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        self.main = Frame1.create(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True

def main():
    application = BoaApp(0)
    application.MainLoop()

if __name__ == '__main__':
    main()
und die dazugehörige Frame1.py

Code: Alles auswählen

#Boa:Frame:Frame1

import wx
import wx.grid

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1BUTTON3, wxID_FRAME1BUTTON4, wxID_FRAME1GRID1, 
 wxID_FRAME1PANEL1, wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, wxID_FRAME1STATICTEXT3, wxID_FRAME1STATICTEXT4, 
 wxID_FRAME1STATICTEXT5, wxID_FRAME1STATICTEXT6, 
] = [wx.NewId() for _init_ctrls in range(13)]

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt, pos=wx.Point(426, 413), size=wx.Size(659, 423),
              style=wx.DEFAULT_FRAME_STYLE, title='Frame1')
        self.SetClientSize(wx.Size(651, 396))
        self.Bind(wx.EVT_SIZE, self.OnFrame1Size)

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self, pos=wx.Point(0, 0), size=wx.Size(651,
              396), style=wx.TAB_TRAVERSAL)
        self.panel1.Bind(wx.EVT_SIZE, self.OnPanel1Size)

        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label=u'ROW -', name='button1', parent=self.panel1,
              pos=wx.Point(20, 80), size=wx.Size(75, 23), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnButton1Button, id=wxID_FRAME1BUTTON1)

        self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label=u'ROW +', name='button2', parent=self.panel1,
              pos=wx.Point(20, 270), size=wx.Size(75, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnButton2Button, id=wxID_FRAME1BUTTON2)

        self.button3 = wx.Button(id=wxID_FRAME1BUTTON3, label=u'COL -', name='button3', parent=self.panel1,
              pos=wx.Point(190, 20), size=wx.Size(75, 23), style=0)
        self.button3.Bind(wx.EVT_BUTTON, self.OnButton3Button, id=wxID_FRAME1BUTTON3)

        self.button4 = wx.Button(id=wxID_FRAME1BUTTON4, label=u'COL +', name='button4', parent=self.panel1,
              pos=wx.Point(500, 20), size=wx.Size(75, 23), style=0)
        self.button4.Bind(wx.EVT_BUTTON, self.OnButton4Button, id=wxID_FRAME1BUTTON4)

        self.grid1 = wx.grid.Grid(id=wxID_FRAME1GRID1, name='grid1', parent=self.panel1, pos=wx.Point(110, 50),
              size=wx.Size(520, 330), style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnGrid1GridCellLeftClick)

        self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1, label=u'Rows', name='staticText1',
              parent=self.panel1, pos=wx.Point(20, 10), size=wx.Size(26, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2, label=u'', name='staticText2', parent=self.panel1,
              pos=wx.Point(60, 10), size=wx.Size(0, 13), style=0)

        self.staticText3 = wx.StaticText(id=wxID_FRAME1STATICTEXT3, label=u'Cols', name='staticText3',
              parent=self.panel1, pos=wx.Point(20, 30), size=wx.Size(20, 13), style=0)

        self.staticText4 = wx.StaticText(id=wxID_FRAME1STATICTEXT4, label=u'', name='staticText4', parent=self.panel1,
              pos=wx.Point(60, 30), size=wx.Size(0, 13), style=0)

        self.staticText5 = wx.StaticText(id=wxID_FRAME1STATICTEXT5, label=u'', name='staticText5', parent=self.panel1,
              pos=wx.Point(110, 10), size=wx.Size(0, 13), style=0)
        self.staticText5.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL,False, u'Tahoma'))
        self.staticText5.SetForegroundColour(wx.Colour(255, 0, 0))

        self.staticText6 = wx.StaticText(id=wxID_FRAME1STATICTEXT6, label=u'', name='staticText6', parent=self.panel1,
              pos=wx.Point(110, 30), size=wx.Size(0, 13), style=0)
        self.staticText6.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL,False, u'Tahoma'))
        self.staticText6.SetForegroundColour(wx.Colour(255, 0, 0))

    def __init__(self, parent):
        self.RowCount=0
        self.ColCount=0
        self.RowPos=0
        self.ColPos=0
        self._init_ctrls(parent)
        self.grid1.CreateGrid(2,2)
        self.updateGridCount()

    def updateGridCount(self):
        self.RowCount=self.grid1.GetNumberRows()
        self.ColCount=self.grid1.GetNumberCols()
        self.staticText2.SetLabel(str(self.RowCount))
        self.staticText4.SetLabel(str(self.ColCount))
        if self.RowCount == 1:
            self.button1.Enable(False)
        else:
            self.button1.Enable(True)
            
        if self.ColCount == 1:
            self.button3.Enable(False)    
        else:
            self.button3.Enable(True)    

    def OnButton1Button(self, event):
        self.grid1.DeleteRows(self.RowCount-1,1)
        self.updateGridCount()
        event.Skip()

    def OnButton2Button(self, event):
        self.grid1.AppendRows(1)
        self.updateGridCount()
        event.Skip()

    def OnButton3Button(self, event):
        self.grid1.DeleteCols(self.ColCount-1,1)
        self.updateGridCount()
        event.Skip()

    def OnButton4Button(self, event):
        self.grid1.AppendCols(1)
        self.updateGridCount()
        event.Skip()


    def updateGridPos(self):
        self.staticText5.SetLabel(str(self.RowPos))
        self.staticText6.SetLabel(str(self.ColPos))

    def OnGrid1GridCellLeftClick(self, event):
        self.RowPos=self.grid1.GetGridCursorRow()
        self.ColPos=self.grid1.GetGridCursorCol()
        self.updateGridPos()
        event.Skip()

    def OnFrame1Size(self, event):
        self.panel1.SetSize(self.GetClientSize())
        event.Skip()

    def OnPanel1Size(self, event):
        self.grid1.SetSize(self.panel1.GetClientSize())
        event.Skip()
Wäre schön, wenn jemand eine Idee hat.

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

Code: Alles auswählen

    def OnPanel1Size(self, event):
        self.grid1.SetSize(self.panel1.GetClientSize())
        event.Skip()
Du verwendest die falsche Size; das ist die size vom Panel.
Ich habe (mit Screenshots herausgemessen) die Werte verändert.
Natürlich nur ein Hack, die Lösung sollte schöner sein.

Code: Alles auswählen

    def OnPanel1Size(self, event):
        w, h = self.panel1.GetClientSize()
        self.grid1.SetSize((w-131, h -66))
        event.Skip() 
Das ist genau der Unterschied, das heisst der Rahmen rechts und unten
bleibt gleich breit.

also 651 (Beginnbreite von Panel) - 520 (Beginnbreite vom Grid) = 131

Besser wäre es gleich Sizer zu verwenden.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Danke erstmal!

Wer lesen kann, ist eindeutig im Vorteil. In der Doku zu ::GetClientSize steht es auch :
..., excluding title bar, border, scrollbars, etc.
:oops:

thx, querdenker
Antworten