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? P> Ce code doit faire les bases, mais la ligne pour rafraîchir la deuxième fenêtre est toujours manquante. P> Espérons que quiconque peut me dire comment cela :) p> p>
4 Réponses :
Vous ne pouvez pas exécuter deux principales principales dans un fil. Votre appel à Un volet racine peut avoir plusieurs fenêtres, vous n'avez pas besoin de créer un root.mainloop () code> 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 () code> parce que c'est la prochaine ligne de code. P>
root2 code>. Vous souhaitez faire deux Toplevel Windows P>
Juste mainloop la fenêtre principale à la fin de votre code et c'est tout
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()
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?
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()
Utiliser 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> 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.
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()
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 i> .. 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 code> et
Intvar code>