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

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

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

Beitragvon pythonist » Sonntag 6. Mai 2007, 11:32

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

Beitragvon gerold » Sonntag 6. Mai 2007, 14:19

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

Beitragvon pythonist » Sonntag 6. Mai 2007, 14:42

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

Beitragvon gerold » Sonntag 6. Mai 2007, 14:53

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

Beitragvon gerold » Sonntag 6. Mai 2007, 14:55

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

Beitragvon gerold » Sonntag 6. Mai 2007, 16:01

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

Beitragvon pythonist » Sonntag 6. Mai 2007, 16:08

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 6. Mai 2007, 17:06

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 Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 6. Mai 2007, 17:27

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder