Wenn ich alle Widgets in einer Applikation lösche, sind auch die gebundenen Events dafür weg.
Wenn ich aber eine Applikation restlos leeren möchte, müsste ich auch die root Window Events wegbekommen. Gibt es da einen Befehl?
Wie kann ich alle Events beim Root window löschen?
Hallo,
bei den universal widget methods gibt es w.unbind_all(sequence). Damit lassen sich wohl die in sequence definierten bindings aplikationsweit löschen. Theoretisch müsste aber auch das root window die Methode w.unbind(sequence) haben, damit ein bestimmtes binding nur im root window gelöscht wird.
http://infohost.nmt.edu/tcc/help/pubs/t ... ersal.html
bei den universal widget methods gibt es w.unbind_all(sequence). Damit lassen sich wohl die in sequence definierten bindings aplikationsweit löschen. Theoretisch müsste aber auch das root window die Methode w.unbind(sequence) haben, damit ein bestimmtes binding nur im root window gelöscht wird.
http://infohost.nmt.edu/tcc/help/pubs/t ... ersal.html
Hier etwas zum herumspielen , wenn es um einzelne Events geht:
Gruss wuf
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from functools import partial
try:
# Tkinter for Python 2.xx
import Tkinter as tk
except:
# Tkinter for Python 3.xx
import tkinter as tk
APP_TITLE = "Testing bind & unbind"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200
def bind_events(widget):
class_name = widget.winfo_class()
if class_name == 'Tk':
widget.bind('<Button-1>', app_win_event)
message = 'Bind Button-1 event'
if class_name == 'Frame':
widget.bind('<Button-3>', frame_event)
message = 'Bind Button-3 event'
print("{}: {}".format(widget.winfo_class(), message))
def unbind_events(widget):
class_name = widget.winfo_class()
if class_name == 'Tk':
widget.unbind('<Button-1>')
message = 'Unbind Button-1 event'
if class_name == 'Frame':
widget.unbind('<Button-3>')
message = 'Unbind Button-3 event'
print("{}: {}".format(widget.winfo_class(), message))
def app_win_event(event):
print('Button-1 pressed')
def frame_event(event):
print('Button-3 pressed')
def main():
app_win = tk.Tk()
app_win.title(APP_TITLE)
app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
frame = tk.Frame(app_win, bg='steelblue')
frame.pack(expand=True, fill='both')
button_frame_root = tk.LabelFrame(app_win, text='Root')
button_frame_root.pack(fill='x')
tk.Button(button_frame_root, text='Bind Events', command=partial(
bind_events, app_win)).pack(side='left')
tk.Button(button_frame_root, text='Unbind Events', command=partial(
unbind_events, app_win)).pack(side='left')
button_frame_frame = tk.LabelFrame(app_win, text='Frame')
button_frame_frame.pack(fill='x')
tk.Button(button_frame_frame, text='Bind Events', command=partial(
bind_events, frame)).pack(side='left')
tk.Button(button_frame_frame, text='Unbind Events', command=partial(
unbind_events, frame)).pack(side='left')
app_win.mainloop()
if __name__ == '__main__':
main()
Take it easy Mates!
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@wuf Danke, aber ich hatte nach etwas gesucht, das restlos alle vom User installierten Events aus dem Rootwindow beseitigt.
Weißt Du, so wie man etwa bei einem Textprogramm eine neue Datei öffnet. Da sollen keine Reste der alten Datei mehr übrig sein.
Aber wenn Events auf dem Rootwindow waren, weil das Script solche enthielt, dann soll man eben für ein neues Script den GUI Designer neu starten.
Die Methoden bind und unbind zu verwalten, habe ich nämlich jetzt keine grosse Lust.
Weißt Du, so wie man etwa bei einem Textprogramm eine neue Datei öffnet. Da sollen keine Reste der alten Datei mehr übrig sein.
Aber wenn Events auf dem Rootwindow waren, weil das Script solche enthielt, dann soll man eben für ein neues Script den GUI Designer neu starten.
Die Methoden bind und unbind zu verwalten, habe ich nämlich jetzt keine grosse Lust.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Hat sich erledigt, kann es ja so machen:
Code: Alles auswählen
import DynTkInter as tk
while True:
root = tk.Tk()
tk.gui()
root.mainloop()