2017-10-12 1 views
-1

Le script suivant crée une fenêtre tkinter avec une étiquette de texte, bouton de sortie et le bouton changer de texte:python - changement d'étiquette tkinter

from tkinter import * 
from tkinter import ttk 

class Window(Frame): 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.master = master 
     self.init_window() 

    def init_window(self): 
     test_label = Label(root, text="none").grid(row=0, column=0, sticky=W) 

     change_text_btn = Button(root, text="change_text", command=self.set_label_text).grid(row=2, column=0, sticky=W) 
     exit_btn = Button(root, text="Exit", command=self.client_exit).grid(row=2, column=1, sticky=W) 

    def set_label_text(self): 
     test_label.config(text='changed the value') 

    def client_exit(self): 
     exit() 

if __name__ == '__main__': 
    root = Tk() 
    app = Window(root) 
    root.mainloop() 

Après avoir cliqué sur change_text_btn j'obtiens une erreur NameError: name 'test_label' is not defined. Donc, le problème est que test_label créé dans init_window() n'est pas disponible à partir de set_label_text() parce que l'étendue. Comment je le répare?

+0

Pourriez-vous mettre en retrait la fonction 'set_label_text' pour la différencier de' init_window? ' – GreenSaber

+0

Il suffit de l'indenter - doent work; indentation et modification comme ceci: 'def set_label_text (auto): self.test_label.config (text = 'a changé la valeur')' ne fonctionne pas; indentation et modification comme ceci: 'def set_label_text(): test_label.config (text = 'a changé la valeur')' ne fonctionne pas aussi bien; dans tous les cas, l'objet 'Window' n'a pas d'attribut 'set_label_text'' erreur – t411tocreate

Répondre

3

Pour résoudre ce problème, vous pouvez définir une variable d'instance test_label en la préfixant avec self. En outre, lors de l'enchaînement des méthodes telles que, ce qui se passe est que vous attribuez None à votre variable, puisque grid() rendements None - au lieu, placer chaque méthode dans une ligne distincte (ce signifie tous vos boutons):

self.test_label = Label(root, text="none") 
self.test_label.grid(row=0, column=0, sticky=W) 

Bien sûr, vous devrez vous y référer plus tard avec self.test_label dans votre fonction set_label_text.

À part cela, je vous suggère de vous débarrasser de from tkinter import *, puisque vous ne savez pas quels noms importent. Il peut remplacer les noms que vous avez importés précédemment, et il est très difficile de voir d'où les noms de votre programme sont censés provenir. Utilisez import tkinter as tk à la place.