ListCtrl-größe bei frame-resize anpassen ?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
s1r0b
User
Beiträge: 13
Registriert: Freitag 30. Dezember 2005, 17:57

Sonntag 14. Januar 2007, 16:04

Hallo,
Ich programmiere gerade einen File-Browser und werde wahrscheinlich noch einige Fragen an euch haben. Hier meine erste :lol: :
Also ich bin soweit, dass ich alle Dateien eines Ordners in einer Liste anzeigen kann.Nun will ich, dass sich die Größe der Liste beim Ändern der Fenstergröße anpasst.
Ich habe es folgendermaßen geschafft, jedoch flimmert der Fensterinhalt beim Vergrößern/Verkleinern unheinmlich.
Gibt es einen anderen Weg, der für das Programm weniger aufwendig ist und somit das Flimmern verhindert werden kann?

Code: Alles auswählen

import wx
import os
import glob

class MainList(wx.ListCtrl):
    def __init__(self, parent, id):
        wx.ListCtrl.__init__(self, parent, id, size=(500,400), style=wx.LC_ICON | wx.LC_AUTOARRANGE)

        self.il = wx.ImageList(32, 32, True)
        for icon in glob.glob("icons/*.png"):
            bmp = wx.Bitmap(icon, wx.BITMAP_TYPE_ANY)
            self.il.Add(bmp)
        self.SetImageList(self.il, wx.IMAGE_LIST_NORMAL)

        j = 1
        for file in os.listdir("."):
            (name, ext) = os.path.splitext(file)

            if os.path.isdir(file):
                self.InsertImageStringItem(j, file, 0)
            elif ext == ".py":
                self.InsertImageStringItem(j, file, 1)
            else:
                self.InsertImageStringItem(j, file, 2)

            j +=1

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Filer")

        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour("White")
        sizer = wx.GridSizer(1,0)
        self.panel.SetSizer(sizer)
        

        self.listctrl = MainList(self.panel, -1)
        sizer.Add(self.listctrl)
        sizer.Fit(self)

        self.Bind(wx.EVT_SIZE, self.OnReSize)

    def OnReSize(self, event):
        size = self.GetSize()
        self.panel.SetSize(size)
        self.listctrl.SetSize(size)

app = wx.PySimpleApp()
frame = MainFrame()
frame.Show()
app.MainLoop()
           
Ich bedanke mich im Voraus für euer Bemühen!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 14. Januar 2007, 16:23

s1r0b hat geschrieben:jedoch flimmert der Fensterinhalt beim Vergrößern/Verkleinern unheinmlich.
Gibt es einen anderen Weg, der für das Programm weniger aufwendig ist und somit das Flimmern verhindert werden kann?
Hi s1r0b!

Du verwendest einen GridSizer, übernimmst aber trotzdem die Arbeit des Sizers selbst. Das ist doppelt gemoppelt. Deshalb flimmert das auch so, da zuerst der Sizer etwas machen will und dann kommst du auch noch dazu.

So nutzt du den Sizer besser aus:

Code: Alles auswählen

import wx
import os
import glob

class MainList(wx.ListCtrl):
    def __init__(self, parent, id):
        wx.ListCtrl.__init__(self, parent, id, size=(500,400), style=wx.LC_ICON | wx.LC_AUTOARRANGE)

        self.il = wx.ImageList(32, 32, True)
        for icon in glob.glob("icons/*.png"):
            bmp = wx.Bitmap(icon, wx.BITMAP_TYPE_ANY)
            self.il.Add(bmp)
        self.SetImageList(self.il, wx.IMAGE_LIST_NORMAL)

        j = 1
        for file in os.listdir("."):
            (name, ext) = os.path.splitext(file)

            if os.path.isdir(file):
                self.InsertImageStringItem(j, file, 0)
            elif ext == ".py":
                self.InsertImageStringItem(j, file, 1)
            else:
                self.InsertImageStringItem(j, file, 2)

            j +=1

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Filer")

        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour("White")
        sizer = wx.GridSizer(1,0)
        self.panel.SetSizer(sizer)

        self.listctrl = MainList(self.panel, -1)
        sizer.Add(self.listctrl, 1, wx.EXPAND | wx.ALL, 5)


app = wx.PySimpleApp()
frame = MainFrame()
frame.Show()
app.MainLoop()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
s1r0b
User
Beiträge: 13
Registriert: Freitag 30. Dezember 2005, 17:57

Sonntag 14. Januar 2007, 16:29

Wow danke für die schnelle Antwort,
funktioniert super!
Antworten