Как мне реализовать диалог выхода в Gtk3?

Я почти закончил свое приложение Ubuntu App Showdown, но хотел бы сделать его несколько более устойчивым, после выхода из приложения я перебираю открытые файлы, проверяя наличие несохраненных файлов, и если они обнаруживаются, я выскакиваю диалоговое окно, информирующее пользователя.

Я хотел бы, чтобы, если пользователь отменяет диалоговое окно, которое возобновляет программа, если пользователь нажимает «ОК», диалоговое окно и главное окно должны закрываться.

Это то, что я имею до сих пор.

self.connect("delete-event", self.CheckSave)

def CheckSave(self, arg1, arg2):
    unsaved = False
    for doc in self.Documents:
        if doc.Saved == False:
            unsaved = True

    if unsaved:
        print("Unsaved document")
        Dialog = Gtk.Dialog("Really quit?", 0, Gtk.DialogFlags.MODAL)
        Dialog.add_button(Gtk.STOCK_NO, Gtk.ResponseType.CANCEL)
        Dialog.add_button(Gtk.STOCK_YES, Gtk.ResponseType.OK)

        box = Dialog.get_content_area()
        label1 = Gtk.Label("There are unsaved file(s).")
        label2 = Gtk.Label("Are you sure you want to quit?")
        box.add(label1)
        box.add(label2)
        box.show_all()

        response = Dialog.run()
        print(response)

        if response == Gtk.ResponseType.OK:
            return(False)
        else:
            return(True)

        Dialog.destroy()

Когда диалог запускается, он никогда не выводит значения ResponseType.OK или ResponseType.CANCEL, я получаю случайные отрицательные числа, такие как -4 или -6, диалоговое окно также никогда не закрывается, и главное окно продолжает выводить диалог и требует CTRL + C, чтобы выйти из него.

3
задан 10 November 2012 в 21:32

1 ответ

Существует несколько проблем с этим кодом.

  • dialog.destroy () метод никогда не будут называть, Вы возвращаете свою функцию перед этим вызовом.

  • Взглянули на Gtk.MessageDialog. Это обработает некоторый шаблонный код, в котором Вы нуждаетесь с постоянным клиентом Gtk.Dialog.

  • Read PEP-8. Это не правило, но обычная практика. Названия UpperCase предназначаются для классов, атрибуты и методы должны быть Camel-регистром или with_underscore.

  • для цикла неэффективен. И целый метод мог быть расположен одна вкладка с отступом меньше.

Вот некоторый пример кода, бодрость духа 8 и messagedialog все еще должна быть сделана.

def confirm_close(self, widget, event):
    unsaved = False
    for doc in self.Documents:
        if not doc.Saved:
            unsaved = True
            break # Break here, no need to check more documents

    if not unsaved:
        Gtk.main_quit()

    #TODO: build the messagedialog
    dialog = Gtk.MessageDialog(....)
    response = dialog.run()
    if response == Gtk.ResponseType.OK:
        # Really quit the application
        Gtk.main_quit()
    # Close the dialog and keep the main window open
    dialog.destroy()
    return True
5
ответ дан 10 November 2012 в 21:32

Другие вопросы по тегам:

Похожие вопросы: