Python Tkinter - fermeture d'une fenêtre avec un bouton quitter
J'ai un Raspberry Pi avec la Piface carte adaptateur. J'ai fait une interface graphique qui contrôle la LED sur la carte Piface.
Un bouton sur l'interface graphique s'ouvre dans une nouvelle fenêtre, sur la pression d'un bouton, démarre et arrête l'exécution d'un petit morceau de code pour faire la LED de faire monter et descendre en permanence, comme Knight Riders de la voiture, à l'aide d'une boucle While dans un thread.
Dans cette nouvelle fenêtre, j'ai ajouté un bouton de SORTIE. Je veux ajouter un morceau de code qui va fermer la nouvelle fenêtre lorsque je clique sur le bouton QUITTER, et puis retourner à la fenêtre principale.
J'ai regardé de nombreux exemples, mais ne peuvent tout simplement pas tout à fait voir ce que je dois faire ou où. J'ai essayé de le quitter, mais il a fermé l'ensemble du programme.
Après avoir regardé de nombreux exemples que j'ai peut-être la création de ma nouvelle fenêtre pas tout à fait de la bonne façon, alors n'hésitez pas à me dire si il y a de meilleures manières.
Donc, il y a une meilleure façon de le faire? Tous les pointeurs serait appréciée.
Merci d'avance.
Heres un morceau de code....
def new_window(self):
print('New Window')
self.newWindow = tk.Toplevel(self.master)
self.app = App2(self.newWindow)
self.newWindow.grab_set() # I added this line to stop opening multiple new windows
class App2:
def __init__(self, master):
frame = Frame(master)
frame.pack()
Label(frame, text='Turn LED ON').grid(row=0, column=0)
Label(frame, text='Turn LED OFF').grid(row=0, column=1)
self.button0 = Button(frame, text='Knight Rider OFF', command=self.convert0)
self.button0.grid(row=2, column=0)
self.LED0 = Label(frame, image=logo2)
self.LED0.grid(row=2, column=1)
self.button9 = Button(frame, text='Exit', command=self.close_window)
self.button9.grid(row=3, column=0)
def convert0(self, tog=[0]):
tog[0] = not tog[0]
if tog[0]:
print('Knight Rider ON')
self.button0.config(text='Knight Rider ON')
t=threading.Thread(target=self.LED)
t.start()
self.signal = True #added to stop thread
self.LED0.config(image = logo)
else:
print('Knight Rider OFF')
self.button0.config(text='Knight Rider OFF')
self.signal = False #added to stop thread
self.LED0.config(image = logo2)
def LED(self):
while self.signal: #added to stop thread
a=0
while self.signal: #added to stop thread
pfio.digital_write(a,1) #turn on
sleep(0.05)
pfio.digital_write(a,0) #turn off
sleep(0.05)
a=a+1
if a==7:
break
while self.signal: #added to stop thread
pfio.digital_write(a,1) #turn on
sleep(0.05)
pfio.digital_write(a,0) #turn off
sleep(0.05)
a=a-1
if a==0:
break
def close_window(self):
print('Close Child window')
#self.newWindow.destroy() Not sure what to put here?
Vous devez vous connecter pour publier un commentaire.
Si vous mettez le
new_window
dans votre App2 alors vous devriez être bien.Détruit la fenêtre. C'est le droit d'appel. La fenêtre est fermée et tous les widgets dans la fenêtre sont également détruits.
quit()
va arrêter lamainloop()
Dans ce cas, le programme se termine à la dernière ligne et détruit tout.Vous voulez absolument utiliser
destroy
.Vous ne devriez pas acces Tkinter, à partir de fils. Jetez un oeil à des solutions de rechange
J'ai été confondu par
quit
etdestroy
, trop, quand j'ai commencé avec Tkinter.App2.start_app()
Idée intéressante de laisser l'application de commencer lui-même. Je n'aurais pas pensé à ça.Dans les Savoirs traditionnels windows sont détruits à l'aide de la méthode destroy. Donc, si vous avez une boîte de dialogue de niveau supérieur et vous voulez vous débarrasser de ce que vous appelez sa destroy() méthode. Ou vous pouvez le retirer, auquel cas l'objet continue d'exister mais n'est plus à l'écran et de les ré-afficher qu'il vous deiconify() toplevel cadre. Il est plus courant de les détruire si. Voici un exemple simple de la création et de la destruction d'un dialogue enfant:
Vous devriez également envisager de regarder à l'aide d'une minuterie dans le code pour piloter les LED boucle plutôt qu'une boucle while. Jetez un oeil à cette réponse l'utilisation de Savoirs traditionnels de la après fonction à exécuter du code après un intervalle. Si vous re-planifier une autre après l'appel dans le gestionnaire, vous pouvez organiser une fonction à exécuter à intervalles réguliers et d'éviter le blocage de la gestion des événements, sans nécessiter de threads supplémentaires.