0
votes

Comment puis-je mettre à jour une fenêtre Tkinter avec une nouvelle variable définie?

Je veux créer deux fenêtres avec un bouton dans la première et une étiquette dans la seconde. Lorsque j'appuie sur le bouton, l'étiquette de la deuxième fenêtre doit actualiser et afficher la variable plus 1.

Je ne veux pas fermer la deuxième fenêtre et l'ouvrir ensuite. Toutes idées comment cela pourrait être fait? xxx

Ce code doit faire les bases, mais la ligne pour rafraîchir la deuxième fenêtre est toujours manquante.

Espérons que quiconque peut me dire comment cela :)


0 commentaires

4 Réponses :


0
votes

Vous ne pouvez pas exécuter deux principales principales dans un fil. Votre appel à root.mainloop () bloque jusqu'à ce que vous fermiez la fenêtre. Une fois que vous fermez la fenêtre, il quitte cette méthode et exécute root2.mainloop () parce que c'est la prochaine ligne de code.

Un volet racine peut avoir plusieurs fenêtres, vous n'avez pas besoin de créer un root2 . Vous souhaitez faire deux Toplevel Windows


1 commentaires

Juste mainloop la fenêtre principale à la fin de votre code et c'est tout



0
votes

Pour développer la réponse déjà donnée, vous devez utiliser Toplevel plutôt que deux fenêtres racines. Aussi, afin de modifier le texte de l'étiquette, vous utilisez étiquette ["texte '] = str (texte) code> pour mettre à jour la valeur.

import tkinter as tk

text = 1
root = tk.Tk()
root2 = tk.Toplevel()

def plus():
    global text
    text = text + 1
    label['text'] = str(text)

label = tk.Label(root, bg="green", text=text, fg="blue")
label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)


button = tk.Button(root2, bg="blue", text="Button", command=plus)
button.pack()

root.mainloop()


1 commentaires

ok merci beaucoup pour la première partie, mais comment puis-je convertir la variable de texte en une chaîne sans appeler l'étiquette exacte que je souhaite utiliser la chaîne dans?



0
votes

Si j'ai compris, essayez-le, chaque fois que vous ouvrez une fenêtre, TOLLEVEL, l'étiquette de la nouvelle fenêtre est incrémentation par 1

import tkinter as tk

class Test(tk.Toplevel):

    def __init__(self, parent, count):
        super().__init__()

        self.parent =  parent
        self.count = tk.IntVar()
        self.count.set(count)

        self.title("I'm a new toplevel.")
        self.init_ui()

    def init_ui(self):

        self.label = tk.Label(self, textvariable=self.count).pack()
        self.close_me = tk.Button(self, text= "Close me", command = self.on_close_me).pack()
        self.close_parent = tk.Button(self, text= "Close parent", command = self.on_close_parent).pack()

    def on_close_me(self):
        self.destroy()        

    def on_close_parent(self):
        self.parent.on_close()


class App(tk.Frame):

    def __init__(self,):

        super().__init__()

        self.master.title("Hello World")

        self.count =0

        self.init_ui()

    def init_ui(self):

        self.pack(fill=tk.BOTH, expand=1,)

        f = tk.Frame()

        w = tk.Frame()

        tk.Button(w, text="Open", command=self.callback).pack()
        tk.Button(w, text="Close", command=self.on_close).pack()

        f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0)
        w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0)


    def callback(self):
        self.count +=1
        obj = Test(self,self.count)

    def on_close(self,evt=None):
        self.master.destroy()

if __name__ == '__main__':
    app = App()
    app.mainloop()


0 commentaires

0
votes

Utiliser TOPLEVEL () CODE> Fenêtre au lieu d'utiliser TK () code> comme Windows secondaire. Tkinter est un seul fileté si on utilise un mainloop () code> suffit pour toutes les fenêtres.

Maintenant que vous avez demandé que vous souhaitez un bouton dans une fenêtre et une étiquette qui met à jour dans la deuxième fenêtre. et aussi vous pouvez rouvrir la fenêtre sans perdre de progrès si vous fermez la deuxième fenêtre. P>

Voici mon chemin. PRE>

import tkinter as tk

root = tk.Tk()
root2 = tk.Toplevel()

# This is a textvariable IntVar can also use StringVar for sting input
text = tk.IntVar()   
text.set(1)             # Set the initial to 1

# Use 'textvariable' instad of text
label = tk.Label(root2, bg="green", textvariable=text, fg="blue")
label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)

label2 = tk.Label(root, textvariable=text)
label2.pack()

def plus():
    global text, root2, label
    if not root2.winfo_exists():  # checks if the window is closed or not
        root2 = tk.Toplevel()
        label = tk.Label(root2, bg="green", textvariable=text, fg="blue")
        label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)

    text.set( text.get()+1 )     # incrementing by 1 ( text.get() will return the value )

button = tk.Button(root, bg="blue", text="Button", command=plus)
button.pack()

root.mainloop()


6 commentaires

Merci aussi mais y a-t-il quelque chose comment je pourrais le faire et ne pas appeler l'étiquette directement?


ne pas appeler l'étiquette directement .. s'il vous plaît élaborer?


Eh bien, dans votre exemple, vous avez directement dit pour l'étiquette ["Texte"] = str (text) mais je veux faire cela sans cette partie de l'étiquette, je veux dire chaque étiquette Sorcière a le texte = texte sous forme de texte comme texte


Je veux en faire en utilisant une variable non pas en racontant l'étiquette directement ce qu'il devrait afficher


@PyTHON_BEGINNER Si vous souhaitez qu'une étiquette représente une variable et modifiez lorsque la variable change, vous devez créer une tâche ou un thread répété qui met à jour le texte de l'étiquette sur un intervalle régulier.


@PyTHON_BEGINNER J'ai mis à jour ma réponse et ajouté plus d'informations sur la manière dont vous pouvez utiliser stringvar et Intvar