Probleme mir Scrollbars (nur unter Windows?)

Plattformunabhängige GUIs mit wxWidgets.
Antworten
aki
User
Beiträge: 1
Registriert: Dienstag 3. April 2007, 18:43

Freitag 6. April 2007, 11:52

Hallo,
ich versuche mich gerade seit kurzem ein wenig mit Python und wxWindows. Aber gleich beim ersten GUI-Programm komme ich irgendwie nicht weiter.
Ziel war es, im oberen Teil der Maske eine (möglicherweise große) Tabelle zu haben und unten ein paar Buttons. Die Tabelle im Testskript ist so groß bzw. das Hauptfenster so klein, dass ich in der Tabelle Scrollbars erwarte.
Wenn ich nun wie in Zeile 18 im folgenden Skript beim Erzeugen des Grids "size=(1,1)" verwende, so erscheinen die Scrollbars beim Aufblenden des Fensters. Wird das Hauptfenster vergrößert, so verschwinden die Scrollbars erwartungsgemäß, wenn die ganze Tabelle sichtbar ist. Wird aber anschließend das Fenster wieder verkleinert, so verhält sich das Programm unter Linux anders als unter Windows: Unter Linux erscheinen die Scrollbars wieder, unter Windows jedoch nicht. Damit ist die Tabelle unter Windows eigentlich nicht mehr bedienbar.
Wenn ich aber wie in Zeile 17 des Skripts beim Erzeugen des Grids "size=wx.DefaultSize" schreibe oder den Parameter weglasse, so sieht man zunächst keine Scrollbars, erst wenn man das Hauptfenster vergrößert, erscheinen sie kurz bevor sie dann nicht mehr benötigt werden und wieder verschwinden

Frage nun:
a) Warum erscheinen unter Windows die Scrollbalken nicht wieder, wenn ich das Fenster vergrößert und dann wieder verkleinert habe?
b) Was genau besagt /wie wirkt der Parameter size im Grid? Anscheinend legt er die (Anfangs-)Größe des "sichtbaren" Bereichs des Grids fest und wenn nicht alle Zeilen und/oder Spalten in diesen sichtbaren Bereich passen, dann erscheinen die Scrollbars am Rande dieses Bereichs? Dabei kann es durchaus sein, das dieser "sichtbare" Bereich nicht sichtbar ist, weil das Hauptfenster zu klein ist?
c) Wenn ich für das Grid eine Standardgröße, z.B. wx.Defaultsize, festlege, müsste dann nicht das Hauptfenster so berechnet sein, dass das Grid in dieser Größe sichtbar ist?
d) Gibt es eine Möglichkeit festzulegen, dass das Fenster nicht größer als notwendig aufgezogen werden kann, also Schluss ist, wenn das Grid vollständig sichtbar ist?

Bin für alle Hinweise und (Teil-)Antworten dankbar.

Viele Grüße,
aki

Code: Alles auswählen

# -*- coding: cp1252 -*-

import wx
import wx.grid

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):

        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetTitle("FrameTest")

        # ein Panel
        self.panel = wx.Panel(self)

        # ein Grid
#        self.grid = wx.grid.Grid(self.panel, -1, size=wx.DefaultSize)
        self.grid = wx.grid.Grid(self.panel, -1, size=(1,1))
        self.grid.CreateGrid(20, 10)

        # zwei Buttons
        self.btn_Speichern = wx.Button(self.panel, -1, "Speichern")
        self.btn_Cancel = wx.Button(self.panel, -1, "Abbrechen")

        # H-Sizer für Buttons
        h_sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        # Buttons in H-Sizer einfügen
        h_sizer.Add(self.btn_Speichern, 0, 0, 0)
        h_sizer.Add(self.btn_Cancel, 0, 0, 0)
        
        # V-Sizer für Grid (oben) und Button-Zeile (unten)
        v_sizer = wx.BoxSizer(wx.VERTICAL)
        
        # Grid und H-Sizer in V-Sizer einfügen
        v_sizer.Add(self.grid, 1, wx.LEFT|wx.RIGHT|wx.EXPAND, 10)       
        v_sizer.Add(h_sizer, 0, wx.LEFT|wx.RIGHT, 20)
        
        # Layout des Panels
        self.panel.SetAutoLayout(True)
        self.panel.SetSizer(v_sizer)
        v_sizer.Fit(self.panel)
        v_sizer.SetSizeHints(self.panel)

#        # Layout des Frames
#        self.SetAutoLayout(True)
#        self.Layout()


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(parent=None)
        frame.Show()
        self.SetTopWindow(frame)
        return True


def main():
    app = MyApp()
    app.MainLoop()

if __name__ == '__main__':
    main()
[/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 6. April 2007, 12:55

aki hat geschrieben:Bin für alle Hinweise und (Teil-)Antworten dankbar.
Hi aki!

Willkommen im Python-Forum!

Das scheint ein richtiger Bug zu sein. Bitte schreibe an die wxPython-Mailingliste um näheres zu erfahren und dann einen Bug-Report.

Leider habe ich keinen schönen Weg gefunden, dieses Verhalten zu beeinflussen. Die Scrollbars kommen erst dann wieder, wenn man entweder die Breite/Höhe einer Zelle verändert oder wenn man eine Spalte/Zeile hinzufügt.

Nicht guter Notfallhack, aber besser als nichts:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx
import wx.grid

wx.SetDefaultPyEncoding("iso-8859-1")


class MyGrid(wx.grid.Grid):
    
    def __init__(self, *args, **kwargs):
        
        wx.grid.Grid.__init__(self, *args, **kwargs)
        self.Bind(wx.EVT_SIZE, self._on_size_hack)
    
    
    def _on_size_hack(self, event):
        # Grausamer, ganz schlimmer Hack (Kinder, bitte nie nachmachen...)
        event.Skip()
        try:
            self.InsertCols(0, 1, False)
            self.DeleteCols(0, 1, False)
        except AssertionError:
            pass
    

class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, id = -1, title = "Example", size = wx.Size(550, 420)
    ):
        
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        grid = MyGrid(panel)
        vbox_main.Add(grid, 1, wx.EXPAND | wx.ALL, 5)
        
        grid.CreateGrid(30, 10)
        self.grid = grid


def main():
    """Testing"""
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten