Tkinter'də pəncərəni bağlayan hadisə necə idarə olunur?

Python Tkinter proqramında pəncərə bağlanma hadisəsini necə idarə edə bilərəm ("X" düyməsinə basmaqla)?

85
21 сент. Matt Gregory tərəfindən təyin olunan Sep 21 2008-09-21 17:46 '08 saat 17:46 'da 2008-09-21 17:46
@ 4 cavab

Tkinter protokol işləyiciləri adlanan bir mexanizmi dəstəkləyir. Burada "protokol" termini ərizə və pəncərə meneceri arasındakı qarşılıqlı əlaqəni ifadə edir. Ən çox istifadə edilən protokol WM_DELETE_WINDOW adlanır və istifadəçi pəncərə meneceri istifadə edərək, pəncərəni aydın şəkildə bağlayanda nə baş verdiyini müəyyən etmək üçün istifadə olunur.

Bu protokol üçün işəgötürən təyin etmək üçün protocol üsulundan istifadə edə bilərsiniz (widget Tk və ya Toplevel ):

Burada xüsusi bir nümunə var:

 import tkinter as tk from tkinter import messagebox root = tk.Tk() def on_closing(): if messagebox.askokcancel("Quit", "Do you want to quit?"): root.destroy() root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop() 
109
21 сент. Cavab Matt Gregory Sep 21 2008-09-21 17:51 '08 at 5:51 pm 2008-09-21 17:51

Matt yaxın düyməni bir klassik dəyişiklik göstərdi.
Bir başqa pəncərə bağlamaq düyməsini bağlamaqdır.
İkinci arqumentin iconify protokolunun metodundan istifadə edərək, bu davranışı yenidən yarata bilərsiniz.

Windows 7-də test edilmiş bir iş nümunəsi:

border=0
 # Python 3 import tkinter import tkinter.scrolledtext as scrolledtext class GUI(object): def __init__(self): root = self.root = tkinter.Tk() root.title('Test') # make the top right close button minimize (iconify) the main window root.protocol("WM_DELETE_WINDOW", root.iconify) # make Esc exit the program root.bind('<Escape>', lambda e: root.destroy()) # create a menu bar with an Exit command menubar = tkinter.Menu(root) filemenu = tkinter.Menu(menubar, tearoff=0) filemenu.add_command(label="Exit", command=root.destroy) menubar.add_cascade(label="File", menu=filemenu) root.config(menu=menubar) # create a Text widget with a Scrollbar attached txt = scrolledtext.ScrolledText(root, undo=True) txt['font'] = ('consolas', '12') txt.pack(expand=True, fill='both') gui = GUI() gui.root.mainloop() 

Bu nümunədə istifadəçiyə iki yeni çıxış variantını veririk:
klassik fayl menyusu → Çıxış, həmçinin Esc düyməsini basın.

14
11 февр. Cavab Dürüst Abe 11 Fevral verilir. 2013-02-11 22:46 '13 at 10:46 pm 2013-02-11 22:46

Tkinter fəaliyyətindən asılı olaraq, sona end. Tkinter.after istifadə edərkən, destroy() istifadə edərək, bu fəaliyyəti dayandırın - protokol (), düymələr və s. - bu hərəkəti (bir səhv "yerinə yetirərkən") pozur və onu dayandırmır. Demək olar ki, bütün hallarda ən yaxşı həll bir bayraq istifadə etməkdir. Burada istifadə etmək üçün sadə, aptal bir nümunə (mən əminəm ki, çoxunuza ehtiyac yoxdur!)

 from Tkinter import * def close_window(): global running running = False print "Window closed" root = Tk() root.protocol("WM_DELETE_WINDOW", close_window) cv = Canvas(root, width=200, height=200); cv.pack() running = True; # This is an endless loop stopped only by setting 'running' to 'False' while running: for i in range(200): if not running: break cv.create_oval(i,i,i+1,i+1); root.update() 

Gözəl qrafika ilə işləməyi dayandırır. Yalnız doğru yerdə running yoxlamaq lazımdır.

0
12 апр. Yanıt Apostollar Apr 12 2018-04-12 20:50 '18 saat 20:50 'da 2018-04-12 20:50

CloseEvent istifadə edin

 def closeEvent(self, event): # code to be executed 
-14
28 мая '11 в 23:22 2011-05-28 23:22 cavab 28 may 2011-ci il saat 23:22 'də Guy Micciche tərəfindən verilmişdir 2011-05-28 23:22

bağlı digər suallar və ya sual