Wie kann ich alle Events beim Root window löschen?

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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?
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hier etwas zum herumspielen , wenn es um einzelne Events geht:

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()
Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
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.
Alfons Mittelmeyer
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()
Antworten