Ich bin mir nicht sicher, wie ich es nennen möchte, daher fällt es mir schwer, die Antwort auf die folgenden Fragen zu finden ...

Ich lösche den Inhalt einer Reihe von tkinter-Eintrags-Widgets. Ich habe vier Zeilen, die so aussehen, als könnte ich sie mit einer Schleife durch eine Zeile ersetzen. Ich habe es versucht ...

for x in range(1, 5):
    self.entryplot_valx.delete(0, tk.END)

Aber ich weiß nicht, wie ich den Wert eingeben soll ... Unten ist mein Code - ich entschuldige mich für die Dummheit dieser Frage

    self.entryplot_val1.delete(0, tk.END)
    self.entryplot_val2.delete(0, tk.END)
    self.entryplot_val3.delete(0, tk.END)
    self.entryplot_val4.delete(0, tk.END)
0
Stuart L 18 Jän. 2019 im 11:43

4 Antworten

Beste Antwort

Sie können dies zum Laufen bringen, indem Sie Ihre Schleife iterabel in ein Tupel dieser vier Einträge ändern:

entries = (self.entryplot_val1,
           self.entryplot_val2,
           self.entryplot_val3,
           self.entryplot_val4)
for x in entries:
    x.delete(0, tk.END)

Da Sie dieses Tupel nicht jedes Mal erstellen möchten, verschieben wir es in die Objektinitialisierung:

def __init__(self):
    # assuming you have a setup like the following
    master = Tk()
    self.entryplot_val1 = Entry(master)
    self.entryplot_val2 = Entry(master)
    self.entryplot_val3 = Entry(master)
    self.entryplot_val4 = Entry(master)
    # initialize your tuple to use in your for loop
    self.entries = (self.entryplot_val1,
                    self.entryplot_val2,
                    self.entryplot_val3,
                    self.entryplot_val4)
    # some further setup for entries
    self.entryplot_val1.pack()
    self.entryplot_val2.pack()
    self.entryplot_val3.pack()
    self.entryplot_val4.pack()

Und dann können Sie dies etwas weiter vereinfachen:

def __init__(self):
    # assuming you have a setup like the following
    master = Tk()
    self.entries = (Entry(master), Entry(master), Entry(master), Entry(master))
    # some further setup for entries
    for x in self.entries:
        x.pack()

Sie können dann an anderer Stelle in Ihrem Klassencode Schleifen in Form des letzten Beispiels verwenden.

Da Sie die vorherigen Bezeichner für die Einträge entfernt haben, müssen Sie Ihren Code ändern, um das neue Tupel überall dort zu verwenden, wo sie verwendet wurden. Ändern Sie also die Referenzen von self.entryplot_val1 in self.entries[0], self.entryplot_val2 in self.entries[1] und so weiter.

3
Tugrul Ates 18 Jän. 2019 im 09:03

Sie können die Variablennamen mit einer Zeichenfolge abrufen.

for x in range(1, 5):
    attr_name = f'entryplot_val{x}'
    getattr(self, attr).delete(0, tk.END)
0
John Go-Soco 18 Jän. 2019 im 08:52

Sie könnten dieses Problem lösen, indem Sie den Attributnamen als Zeichenfolge erstellen und getattr(obj, attrname) verwenden, dh:

for x in range(1, 5):
    attrname = "entryplot_val{}".format(x)
    getattr(self, attrname).delete(0, tk.END)

Aber wirklich, wenn Sie ein "var1" -, "var2" (...) "varX" -Namensschema verwenden, möchten Sie wahrscheinlich stattdessen wirklich eine Liste.

0
bruno desthuilliers 18 Jän. 2019 im 08:51

Sie können get_attr() folgendermaßen verwenden:

for x in range(1, 5):
    get_attr(self, "entryplot_val{}".format(x)).delete(0, tk.END)

Siehe diesen Teil des Dokuments.

0
Cyrlop 18 Jän. 2019 im 08:51