Python Tkinter - schließen eines untergeordneten Fensters mit exit-button
Ich habe ein Raspberry Pi mit Piface-Adapter-platine. Ich habe eine GUI für die Ansteuerung der LED auf dem Piface board an.
Über eine Taste auf der GUI öffnet sich ein neues Fenster, das auf Knopfdruck startet und Stoppt das laufen ein kleines Stück code, um die LED ' s rauf und runter laufen kontinuierlich, wie Knight Rider Auto, kann mit einer While-Schleife in einen thread.
In diesem neuen Fenster habe ich eine EXIT-Taste. Ich möchte hinzufügen, ein Stück code, das wird schließen Sie das neue Fenster, wenn ich auf den EXIT-button, und dann, um zum Hauptfenster zurückzukehren.
Ich habe mir viele Beispiele, aber einfach nicht ganz das, was ich sehen sollte oder wo. Ich habe versucht die 'beenden', aber es geschlossen, das ganze Programm.
Nachdem wir sahen viele Beispiele, die ich vielleicht schaffen mein neuer Fenster in nicht ganz der richtige Weg, so fühlen sich frei, mir zu sagen, wenn es bessere Möglichkeiten gibt.
Also gibt es einen besseren Weg, es zu tun? Alle Hinweise wären sehr willkommen.
Vielen Dank im Voraus.
Heres ein Stück von dem 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?
InformationsquelleAutor blast_uk | 2014-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du die
new_window
in Ihre App2, dann sollten Sie in Ordnung sein.Zerstört das Fenster. Dies ist der richtige Aufruf. Das Fenster wird dann geschlossen und alle widgets im Fenster werden auch zerstört.
quit()
wird, Stoppt dermainloop()
In diesem Fall endet das Programm in der letzten Zeile und zerstört auch alles.Wollen Sie auf jeden Fall verwenden
destroy
.Sollten Sie nicht acces Tkinter von threads. Haben Sie einen Blick auf alternativen
Ich war verwirrt durch
quit
unddestroy
auch, als ich anfing mit Tkinter.Ich habe eine neue Methode für das starten der app.
App2.start_app()
Interessante Idee, lassen Sie die app selbst starten. Hätte ich nicht gedacht.Sorry, aber ich bin verloren jetzt, Neuling-Syndrom. Leider habe ich verwirrte mich, und ich habe nicht erklärt es eindeutig. Vielen Dank für die Ratschläge und die links zu den thread-alternativen.
InformationsquelleAutor User
Im Tk-Fenster sind zerstört, mit der destroy-Methode. Also, wenn Sie einen dialog toplevel und Sie loswerden möchten, wird es Sie rufen die Methode destroy (). Oder Sie können diese widerrufen, in welchem Fall das Objekt existiert weiter, ist aber nicht mehr auf dem Bildschirm, und erneut zeigen, dass es Sie deiconify() den obersten frame. Es ist eher üblich, Sie zu zerstören obwohl. Hier ist ein einfaches Beispiel erstellen und zerstören von einen Kind-dialog:
Sollten Sie auch prüfen, auf der Suche mit einem timer im code, um die LED-Laufwerk-Schleife statt einer while-Schleife. Werfen Sie einen Blick auf diese Antwort mit Tk nach Funktion um code auszuführen, nachdem ein Intervall. Wenn Sie re-schedule eine weitere nach dem Aufruf in der Prozedur, dann können Sie gerne eine Funktion ausgeführt werden, die in regelmäßigen Abständen und vermeiden Sie die Blockierung der event-handling-ohne zusätzliche Fäden.
InformationsquelleAutor patthoyts