Уведомления

Группа в Telegram: присоединиться

#1 Фев. 14, 2019 07:23:00

nick789
Зарегистрирован: 2016-09-21
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Завершение оконной программы по крестику

 #!/usr/bin/python3.5
# -*- coding: utf-8 -*-
from tkinter import *
from tkinter import messagebox as mb
def programm_exit():
    print("exit")
    answer = mb.askyesno(title="Завершение работы программы", message="Выйти из программы?")
    if answer == True:             
        root.destroy()
root = Tk()
root.title("Python")
root.bind('<Destroy>', programm_exit)
root.mainloop()
>>> Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib64/python3.5/tkinter/__init__.py", line 1558, in __call__
    return self.func(*args)
TypeError: programm_exit() takes 0 positional arguments but 1 was given

Меняем
def programm_exit(event):

 >>> exit
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib64/python3.5/tkinter/__init__.py", line 1558, in __call__
    return self.func(*args)
  File "/home/user/py/test_window/test2.py", line 10, in programm_exit
    answer = mb.askyesno(title="Завершение работы программы", message="Выйти из программы?")
  File "/usr/lib64/python3.5/tkinter/messagebox.py", line 104, in askyesno
    s = _show(title, message, QUESTION, YESNO, **options)
  File "/usr/lib64/python3.5/tkinter/messagebox.py", line 72, in _show
    res = Message(**options).show()
  File "/usr/lib64/python3.5/tkinter/commondialog.py", line 44, in show
    w = Frame(self.master)
  File "/usr/lib64/python3.5/tkinter/__init__.py", line 2592, in __init__
    Widget.__init__(self, master, 'frame', cnf, {}, extra)
  File "/usr/lib64/python3.5/tkinter/__init__.py", line 2147, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: this isn't a Tk applicationunable to create widget ".140512013776544"

Ух ты! А всего то хотелось создать обработчик, при закрытии формы-окна крестиком, который справа в верху.
Окно с вопросом не появилось.

http://python.su/forum/topic/3571/?page=1#post-23046

Отредактировано nick789 (Фев. 14, 2019 07:31:54)

Офлайн

#2 Фев. 14, 2019 10:10:44

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1422
Репутация: +  202  -
Профиль   Отправить e-mail  

Завершение оконной программы по крестику

nick789
http://python.su/forum/topic/3571/?page=1#post-23046
вы то внимательно читали что там написано? где там root.bind('<Destroy>'..)?? root.bind('<Destroy>'…) не перехватывает закрытие, чтобы перехватить закрытие корневого окна, нужно использовать метод protocol http://effbot.org/zone/tkinter-window-destroy.htm

Ваш programm_exit сработает когда root будет уже закрыто и инстанс Tk() уже не будет сушествовать , поэтому вы получаете исключение на создание messagebox,
обратите внимание на код:
  #
# -*- coding: utf-8 -*-
from tkinter import *
from tkinter import messagebox as mb
def confirm_exit():
    print('ask to exit')
    answer = mb.askyesno(title="Завершение работы программы", message="Выйти из программы?")
    if answer == True:
        print('exiting program')
        root.destroy()
def programm_exit(event):
    print("destroy", event.widget)
root = Tk()
root.title("Python")
root.bind('<Destroy>', programm_exit)
root.protocol('WM_DELETE_WINDOW', confirm_exit)
root.mainloop()
ваш programm_exit будет срабантывать на закрытие ЛЮБОГО окна, но уже после его закрытия.

Отредактировано PEHDOM (Фев. 14, 2019 10:19:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version