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

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

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

Beitragvon s1r0b » 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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

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

Beitragvon gerold » 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

Beitragvon s1r0b » Sonntag 14. Januar 2007, 16:29

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder