Seite 1 von 1

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

Verfasst: Sonntag 14. Januar 2007, 16:04
von s1r0b
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!

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

Verfasst: Sonntag 14. Januar 2007, 16:23
von gerold
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
:-)

Verfasst: Sonntag 14. Januar 2007, 16:29
von s1r0b
Wow danke für die schnelle Antwort,
funktioniert super!