In meiner Tkinter App habe ich eine Schaltfläche, die ein Toplevel-Fenster öffnet, das ein Ereignisprotokoll anzeigt. Es gibt ein paar Dinge, die ich brauche, um das Toplevel-Fenster ausführen zu können:Tkinter Toplevel Fenster nicht beweglich
- Zeigen Sie die vorherigen Protokolleinträge an, wenn Sie geöffnet sind, und aktualisieren Sie sie mit neuen.
- die Fähigkeit des Benutzers Deaktivieren Sie die Fenster um die während zu bewegen auch das Fenster der Benutzer in der Lage zu schließen machen
- Haben das Fenster immer mit seiner rechten oberen Ecke in der oberen rechten Ecke des Fensters Wurzel ist verankert werden
Ich habe # 1 herausgefunden. Ich kann das Fenster öffnen und vorherige Einträge anzeigen sowie diese Einträge aktualisieren, während das Fenster geöffnet ist. Mein Problem ist mit # 2 und # 3.
Für # 2 bin ich nicht sicher, wie Sie die Fähigkeit des Benutzers deaktivieren, das Fenster zu verschieben. Ich gehe davon aus, dass dies auch die Fähigkeit des Benutzers deaktivieren kann, das Fenster zu schließen, so dass ich nicht sicher bin, wie ich diese Funktionalität intakt halte. Vielleicht eine Taste mit self.quit()
als Befehl?
Wie für # 3 habe ich keine Ahnung, wie man das macht. Vielleicht sauge ich als Googling, aber ich kann nicht herausfinden, wie das zu erreichen ist.
Dies ist der Code, den ich im Moment habe, der Feature # 1 richtig implementieren kann.
import tkinter as tk
class guiapp(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.master = master
self.value = 0.0
self.alive = True
self.list_for_toplevel = []
btn = tk.Button(self.master, text = "Click", command = self.TextWindow)
btn.pack()
def TextWindow(self):
self.textWindow = tk.Toplevel(self.master)
self.textFrame = tk.Frame(self.textWindow)
self.textFrame.pack()
self.textArea = tk.Text(self.textWindow, height = 10, width = 30)
self.textArea.pack(side = "left", fill = "y")
bar = tk.Scrollbar(self.textWindow)
bar.pack(side = "right", fill = "y")
bar.config(command = self.textArea.yview)
self.alive = True
self.timed_loop()
def timed_loop(self):
if self.alive == True and tk.Toplevel.winfo_exists(self.textWindow):
self.master.after(1000, self.timed_loop)
self.value += 1
self.list_for_toplevel.append(self.value)
self.textArea.delete(1.0, "end-1c")
for item in self.list_for_toplevel:
self.textArea.insert('end', "{}\n".format(item))
self.textArea.see('end')
else:
self.alive = False
if __name__ == "__main__":
root = tk.Tk()
root.geometry("800x480")
myapp = guiapp(root)
root.mainloop()
Dies ist im Grunde, was ich suche. Vielen Dank :) – Skitzafreak
@Skitzafreak: Ich musste einige Bugs austesten, um zu überprüfen, ob ein Fenster existiert. Ich habe gerade meine Antwort aktualisiert, um Fehler zu vermeiden, die aufgrund einiger if-Anweisungen aufgetreten sind. Lassen Sie mich wissen, wenn Sie Fragen zum aktualisierten Code haben. –