2017-01-25 3 views
0

Ich versuche, ein Dialogfeld in Ironpython zu erstellen, das mehrere Textfelder für Benutzereingaben für eine Tabelle mit mehreren Spalten bietet. Ich habe jedoch Schwierigkeiten, die Benutzereingabewerte an eine andere Funktion zu übergeben. Mein Code sieht wie folgt aus:Wie kann ich die Eingabe für mehrere Textbox-Dialog in Python speichern?

self.newVal = [] 
for column in columns: 
      self.label = Label() 
      self.label.Text = col 
      self.label.Location = Point(10, offset) 
      self.cb = Textbox() 
      self.cb.Text = "Type in new value" 
      self.cb.Location = Point(150,offset) 
      self.cb.Height = 20 
      self.cb.Width = 295 
      self.cb.Enabled = True 
      self.Controls.Add(self.label) 
      self.Controls.Add(self.cb) 
      self.newVal.append(self.cb.Text) 
      offset = offset + 30 

Das Problem ist, dass die self.newVal bestand aus diesem Code nur die ursprüngliche Nachricht von „Art in dem neuen Wert“ ist, dauert es nicht wirklich die Benutzereingabewerte im Text Box, wenn sie von einer anderen Funktion aufgerufen wird. Wenn von einer anderen Funktion auf self.cb.Text verwiesen wird, ist der Wert tatsächlich der Wert, den der Benutzer neu eingegeben hat. Aber das funktioniert nicht für mich, weil self.cb.Text nur die Eingabe für die letzte Spalte gibt. Während self.newVal enthält alle Spaltenwerte, außer es wird nicht mit der Benutzereingabe wie erwähnt aktualisiert.

Eine andere verwandte Frage. Ich versuchte, mit diesem Problem umzugehen, indem ich mehrere Textboxen definierte und sie einzeln weitergab. Aber ich kann keine Möglichkeit finden, eine Variable nach self. zu verwenden. Zum Beispiel in dem obigen Code, wenn ich self.col statt self.cb, wird der Code nicht wirklich col als Variable behandelt hier alles, was ich bekomme, ist eine einziges self.col mit col ein String ist, genau die gleiche wie self.cb verwenden. Ist es möglich, eine Variable nach self. in einer Klasse zu verwenden?

+0

Wenn Sie Text von 'self.cb.Text' in" einer anderen Funktion "erhalten können, dann holen Sie sich diesen Text in" andere Funktion "und hängen Sie an' self.newVal' an. Programm wird dies nicht automatisch anhängen, Sie müssen manuell anhängen. – furas

+1

'self.col' ist variabel, weil Sie seine Werte immer ändern können. Es ist unklar, was Sie erwarten. Vielleicht liegt Ihr Problem daran, dass Sie '' Textbox() 'einer Variablen zuweisen, so dass Sie vorherige Werte überschreiben und keinen Zugriff auf vorherige' Textbox() 'haben - behalten Sie sie auf der Liste' self.all_cb.append (self.cb) ' und dann haben Sie Zugriff auf "self.all_cb [0] .Text", "self.all_cb [1] .Text" usw. – furas

Antwort

1

Danke Furas! Die Verwendung von self.all_cb.append(self.cb) anstelle von self.newVal.append(self.cb.Text) löste das Problem.

0

Wie bereits erwähnt, müssen Sie jede initialisierte TextBox zu einer Liste hinzufügen oder eine neue Variable für jede TextBox erstellen. Zum Beispiel:

self.textbox_list = [] 
for _ in columns: 
    textbox = TextBox() 
    self.textbox_list.append(textbox) 

Obwohl ich lieber Wörterbuch, wo die Schlüssel sind die Spalten verweisen:

self.textbox_dict = {} 
for i in range(columns): 
    textbox = TextBox() 

    # Here you can manipulate the textbox 

    self.textbox_dict[i] = textbox 

# Then reference each TextBox by column number 
val = self.textbox_dict[0].Text 

Sie können auch eine Klasse-Funktion erstellen, die Tabelle zu initialisieren. Hier zeige ich auch ein Beispiel, wie man die Namen der TextBox-Objektvariablen dynamisch mit setattr erzeugt.

class MyClass: 
    columns = 8 
    self.init_table(columns) 

    # Then you can reference the textbox by variable name 
    val = self.textbox_0.Text 

    def init_table(self, cols): 
     for i in range(cols): 
      setattr(self, "textbox_{}".format(i), TextBox()) 
Verwandte Themen