Box-Sizer ordnet die Einträge nicht untereinander an.

Plattformunabhängige GUIs mit wxWidgets.
Antworten
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Hi,

das ist mein erstes richtiges wxPython-Programm und ich steckt schon richtig fest. Also ich will das immer genau so viel TextFelder da sind wie in der ComboBox ausgewählt. Die TextFelder füg ich mit insertfelder ein. Beim ersten mal klapt das auch wunderbar. Nur sobald ich die Anzahl verändern will ist nur noch oben eins, ich nehm mal stark an das die dann alle übereinander sind. Ich find aber nicht wirklich nen Fehler.
Hier der Code:

Code: Alles auswählen

class hauptframe(wx.Frame):
    
    def __init__(self):
        
        self.ordner = []
        
        wx.Frame.__init__(self, None, -1, "TagTeil.py", wx.DefaultPosition, wx.DefaultSize)
        self.vertsizer = wx.BoxSizer(wx.VERTICAL)
        moeglichkeiten = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "12", "15", "20"]
        self.combo = wx.ComboBox(self, 2, size=(70, -1), choices=moeglichkeiten)
        self.vertsizer.Add(wx.StaticText(self, -1, "Startpfad:"), 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.startpfad = wx.TextCtrl(self, -1, size=(300, -1))
        self.vertsizer.Add(self.startpfad, 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.vertsizer.Add(wx.StaticText(self, -1, "Anzahl der Ordner:"), 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.vertsizer.Add(self.combo, 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.panel = wx.Panel(self, -1)
        self.vertsizer.Add(self.panel, 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.panelsizer = wx.BoxSizer(wx.VERTICAL)
        self.vertsizer.Add(wx.Button(self, 1, "Datei Erzeugen"), 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.SetSizer(self.vertsizer)
        self.combo.SetSelection(4)
        self.insertfelder(5)
        
        self.Bind(wx.EVT_BUTTON, self.start, id=1)
        self.Bind(wx.EVT_COMBOBOX, self.combostart, id=2)
    
    def combostart(self, event):
        self.insertfelder(int(self.combo.GetValue()))
    
    def start(self):
        pass
    
    def insertfelder(self, zahl):
        for i in self.ordner:
            self.panelsizer.Remove(i)
            i.Destroy()
        self.ordner = []
        self.panel.SetSizer(self.panelsizer)
        for z in range(zahl):
            tc = wx.TextCtrl(self.panel, -1, size=(300, -1))
            self.panelsizer.Add(tc, 0)
            self.ordner.append(tc)
            print z
        self.panel.SetSizer(self.panelsizer)
Danke schon mal für die Hilfe

pythonist
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Pythonist!

Bitte stelle solche Fragen wenn möglich mit einem funktionierenden Beispiel. Dann müssen wir zum Testen deinen Code nicht erst in ein funktionierendes/startbares Beispiel einbauen.

``wx.DefaultPosition, wx.DefaultSize`` musst du nicht angeben. ``pos`` und ``size`` sind sowiso damit vorbelegt.

Schreibe Klassennamen, zur leichteren Unterscheidung, bitte groß:

Code: Alles auswählen

class HauptFrame(wx.Frame):
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Ok ich hab das Ganze jetzt mal auf den Gridsizer umgestellt ohne Erfolg.
Hier der gesamte Code:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#TagTeil für HiGh-FlY

import wx

class HauptFrame(wx.Frame):
    
    def __init__(self):
        
        self.ordner = []
        
        wx.Frame.__init__(self, None, -1, "TagTeil.py")
        self.vertsizer = wx.BoxSizer(wx.VERTICAL)
        moeglichkeiten = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "12", "15", "20"]
        self.combo = wx.ComboBox(self, 2, size=(70, -1), choices=moeglichkeiten)
        self.vertsizer.Add(wx.StaticText(self, -1, "Startpfad:"), 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.startpfad = wx.TextCtrl(self, -1, size=(300, -1))
        self.vertsizer.Add(self.startpfad, 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.vertsizer.Add(wx.StaticText(self, -1, "Anzahl der Ordner:"), 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.vertsizer.Add(self.combo, 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.panel = wx.Panel(self, -1)
        self.vertsizer.Add(self.panel, 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.vertsizer.Add(wx.Button(self, 1, "Datei Erzeugen"), 0, wx.ALIGN_CENTER_HORIZONTAL)
        self.SetSizer(self.vertsizer)
        self.combo.SetSelection(4)
        self.insertfelder(5)
        
        self.Bind(wx.EVT_BUTTON, self.start, id=1)
        self.Bind(wx.EVT_COMBOBOX, self.combostart, id=2)
    
    def combostart(self, event):
        #self.insertfelder(int(self.combo.GetValue()))
        for i in self.ordner:
            #self.panelsizer.Remove(i)
            self.gsizer.Remove(i[0])
            self.gsizer.Remove(i[1])
        self.insertfelder(int(self.combo.GetValue()))
    def start(self):
        pass
    
    def insertfelder(self, zahl):
        
        #for i in self.ordner:
        #    #self.panelsizer.Remove(i)
        #    i.Destroy()
        self.ordner = []
        self.gsizer = wx.GridSizer(zahl, 2, 4, 4)
        for z in range(zahl):
            st = wx.StaticText(self.panel, -1, str(z) + ": ")
            self.gsizer.Add(st,0, wx.ALIGN_RIGHT)
            tc = wx.TextCtrl(self.panel, -1, size=(400, -1))
            self.gsizer.Add(tc,0, wx.ALIGN_LEFT)
            self.ordner.append([st, tc])
            print z
        self.panel.SetSizer(self.gsizer)
        
class MyApp(wx.App):
    def OnInit(self):
        frame = HauptFrame()
        frame.Show(True)
        return True

app = MyApp()
app.MainLoop()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Pythonist!

Ich bastle mal ein kleines Beispiel zusammen. Dauert aber noch ein bischen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Pythonist!

Es gibt ein paar Dinge an deinem Code, die ich gerne, gemeinsam mit dir verbessern würde. Diese zähle ich hier auf. Vielleicht brigt es dir etwas.

1.) Es hat sich eingebürgert, dass wir Klassennamen Groß schreiben. So lässt sich beim Lesen des Codes sofort identifizieren, ob mit einer Klasseninstanz oder mit einer Klasse gearbeitet wird. Das erleichtert die Lesbarkeit des Codes.

2.) Du kannst innerhalb einer Methode ruhig mal eine Variable ohne "self." verwenden. Auch wenn du später diese Variable als Instanzvariable brauchst. Du sparst dir damit viel Tipparbeit:

Code: Alles auswählen

    vorname = wx.TextCtrl(panel)
    vbox.Add(vorname)
    vorname.SetValue("hallo")
    self.vorname = vorname # Ab jetzt ist vorname auch an die Instanz gebunden
3.) Auf die IDs können wir inzwischen fast ganz verzichten. Das war einfach zu umständlich. Wie? Das zeige ich im Beispiel.

Beispiel: --> http://www.python-forum.de/post-66832.html

Bild

mfg
Gerold
:-)

Stichworte: Widgets dynamisch erstellen löschen Layout sizer destroy

Edit: Link zum Beispiel geändert.
Zuletzt geändert von gerold am Sonntag 6. Mai 2007, 17:25, insgesamt 5-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Das Beispiel ist fertig. Wenn du Fragen hast, einfach melden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Erst mal großes Danke für die Mühe gerold. Ich muss jetzt noch was anderes erledigen, ich werds mir dann mal heut abend genau anschauen und wenn ich fragen hab fragen :wink:

pythonist
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:Beispiel: --> http://dpaste.com/hold/9730/
Keine gute Idee. Nach 30 Tagen ist das weg.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Leonidas hat geschrieben:Nach 30 Tagen ist das weg.
Hi Leonidas!

Danke, das hatte ich übersehen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten