Seite 1 von 1

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

Verfasst: Sonntag 6. Mai 2007, 11:32
von pythonist
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

Verfasst: Sonntag 6. Mai 2007, 14:19
von gerold
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
:-)

Verfasst: Sonntag 6. Mai 2007, 14:42
von pythonist
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()

Verfasst: Sonntag 6. Mai 2007, 14:53
von gerold
Hi Pythonist!

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

mfg
Gerold
:-)

Verfasst: Sonntag 6. Mai 2007, 14:55
von gerold
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.

Verfasst: Sonntag 6. Mai 2007, 16:01
von gerold
Hi!

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

mfg
Gerold
:-)

Verfasst: Sonntag 6. Mai 2007, 16:08
von pythonist
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

Verfasst: Sonntag 6. Mai 2007, 17:06
von Leonidas
gerold hat geschrieben:Beispiel: --> http://dpaste.com/hold/9730/
Keine gute Idee. Nach 30 Tagen ist das weg.

Verfasst: Sonntag 6. Mai 2007, 17:27
von gerold
Leonidas hat geschrieben:Nach 30 Tagen ist das weg.
Hi Leonidas!

Danke, das hatte ich übersehen.

lg
Gerold
:-)