Вам необходимо подключиться к delete-event
из Gtk.Window
, которые вы используете в окне приложения. delete-event
позволяет вам отображать диалоговое окно подтверждения и, в зависимости от ответа пользователя, вы можете либо вернуть True
- это означает, что вы обработали событие и что распространение сигнала должно быть остановлено; или return False
- это означает, что распространение сигнала должно продолжаться, что вызовет вызов метода destroy()
в виджетах.
Сигнал delete-event
излучается в ответ на запрос о завершении от диспетчера окон; например, при использовании меню окна; комбинация клавиш, такая как Alt + F4; или кнопку «Закрыть» окна.
Простой пример, демонстрирующий выше:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gio
from gi.repository import Gtk
class AppWindow (Gtk.ApplicationWindow):
def __init__(self):
Gtk.ApplicationWindow.__init__(self)
self.set_default_size(200, 200)
# Override the default handler for the delete-event signal
def do_delete_event(self, event):
# Show our message dialog
d = Gtk.MessageDialog(transient_for=self,
modal=True,
buttons=Gtk.ButtonsType.OK_CANCEL)
d.props.text = 'Are you sure you want to quit?'
response = d.run()
d.destroy()
# We only terminate when the user presses the OK button
if response == Gtk.ResponseType.OK:
print('Terminating...')
return False
# Otherwise we keep the application open
return True
def on_activate(app):
# Show the application window
win = AppWindow()
win.props.application = app
win.show()
if __name__ == '__main__':
# Create an application instance
app = Gtk.Application(application_id='com.example.ExampleApp', flags=0)
# Use ::activate to show our application window
app.connect('activate', on_activate)
app.run()
Спасибо за такой подробный ответ! Попробуем это реализовать. – joaquinlpereyra
Как вы это делаете, когда ваш основной класс имеет тип 'class App (Gtk.Application)'? – Redsandro