2016-04-28 4 views
2

Я пытаюсь попросить пользователя подтвердить, когда он попытается закрыть мое приложение. Но я не знаю, как поймать все возможные способы выхода из приложения: в окне есть кнопка «X», Alt + F4, я сам использую Alt + Shift + Q на i3.GTK + 3: Запрашивать подтверждение перед закрытием приложения

Как бы об этом рассказать?

ответ

3

Вам необходимо подключиться к 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() 
+0

Спасибо за такой подробный ответ! Попробуем это реализовать. – joaquinlpereyra

+0

Как вы это делаете, когда ваш основной класс имеет тип 'class App (Gtk.Application)'? – Redsandro

Смежные вопросы