0
votes

Python 3.x - Utilisation de la chaîne de texte comme nom de variable

J'essaie d'éviter de multiplier des fonctions dans le code en utilisant

import tkinter as tk
from tkinter import *

class WINDOW():
    def __init__(self):
        self.Settings_Window()

    def Settings_Window(self):
        self.settings_window = tk.Tk()
        self.settings_window.minsize(200,200)
        self.entry = Entry(self.settings_window)
        self.entry.pack()
        self.entry2 = Entry(self.settings_window)
        self.entry2.pack()
        self.label1input = StringVar()
        self.label = Label(self.settings_window,textvariable=self.label1input, bg='yellow')
        self.label.pack(expand='yes',fill='x')
        self.label2input = StringVar()
        self.label2 = Label(self.settings_window, textvariable=self.label2input, bg='yellow')
        self.label2.pack(expand='yes', fill='x')
        self.button = Button(self.settings_window,text='SETUP1',command=self.Next)
        self.button.pack()
        self.button2 = Button(self.settings_window,text='SETUP2',command=self.Next2)
        self.button2.pack()
        self.settings_window.mainloop()

    def Next(self):
        self.number=1
        self.Return_Label(self.number)

    def Next2(self):
        self.number=2
        self.Return_Label(self.number)

    def Return_Label(self,number):
        self.entry_field_value = self.entry.get()
        print(self.entry_field_value)
        #self.label1input.set(self.entry_field_value)
        setattr(self,'label'+str(number)+'input.set',self.entry_field_value)

window=WINDOW()


3 commentaires

Voulez-vous dire que vous voulez dire getattr (auto, 'étiquette' + str (numéro) + 'Entrée'). SET (Self.Endry_field_Value) ?


Les listes et les dicts sont votre ami.


getattr ... fonctionne. Merci. Bien que pleinement conviennent que le code devrait être plus court / nitre


3 Réponses :


0
votes

Créer listes d'objets plutôt que des attributs individuels pour chaque objet. Par exemple, xxx


1 commentaires

Vrai. C'était un exemple rapide et sale visant à faire preuve de mon point sur une utilisation variable. Merci de votre contribution.



0
votes

Les noms de variable informatique dynamiquement doivent être évités à tout prix. Ils sont difficiles à faire correctement, et cela rend votre code difficile à comprendre, difficile à maintenir et difficile à déboguer.

Au lieu de cela, stockez les widgets dans un dictionnaire ou une liste. Par exemple: xxx

Cependant, vous n'avez vraiment pas besoin d'utiliser stringvar du tout - ils ont généralement ajouté des frais généraux supplémentaires sans fournir de supplément évaluer. Vous pouvez enregistrer les étiquettes au lieu des variables et appeler configuration sur les étiquettes xxx


0 commentaires

0
votes

Je préfère une approche de liste pour gérer plusieurs champs d'entrée et mettre à jour les valeurs. En utilisant la liste, vous pouvez également utiliser la valeur d'index pour gérer également les étiquettes: d.

Voir l'exemple ci-dessous de la manière dont vous pouvez utiliser la liste pour faire face à toutes les valeurs et mises à jour. P>

import tkinter as tk
from tkinter import *

class Window(tk.Tk):
    def __init__(self):
        super().__init__()
        self.minsize(200, 200)
        self.entry_list = []
        self.label_list = []
        entry_count = 2

        for i in range(entry_count):
            self.entry_list.append(Entry(self))
            self.entry_list[i].pack()

        for i in range(entry_count):
            self.label_list.append(Label(self,bg='yellow'))
            self.label_list[i].pack(expand='yes', fill='x')

        Button(self, text='SETUP', command=self.Return_Label).pack()

    def Return_Label(self):
        for ndex, lbl in enumerate(self.label_list):
            lbl.config(text=self.entry_list[ndex].get())

if __name__ == '__main__':
    Window().mainloop()


0 commentaires