Como faço para implementar um diálogo de saída no Gtk3?

2

Eu quase terminei meu aplicativo Ubuntu App Showdown, mas gostaria de torná-lo um pouco mais robusto, após o aplicativo sair eu percorro os arquivos abertos verificando arquivos não salvos, se algum for encontrado, eu abro uma caixa de diálogo informando o usuário.

O que eu gostaria de acontecer é que, se o usuário cancelar a caixa de diálogo, o programa continuará, se, no entanto, o usuário clicar em OK, a caixa de diálogo e a janela principal deverão ser fechadas.

Isso é o que eu tenho até agora.

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()

Quando a caixa de diálogo é executada, nunca saem os valores ResponseType.OK ou ResponseType.CANCEL, recebo números negativos aleatórios, como -4 ou -6, a caixa de diálogo também nunca fecha e a janela principal continua a emitir diálogo e requer uma CTRL + c para sair.

    
por Neil Munro 03.07.2012 / 01:57

1 resposta

4

Existem vários problemas com este código.

  • O método dialog.destroy () nunca será chamado, você retorna sua função antes desta chamada.

  • Veja o Gtk.MessageDialog . Ele irá lidar com algum código clichê que você precisa com um Gtk.Dialog regular.

  • Leia o PEP-8 . Não é uma regra, mas prática comum. Os nomes de UpperCase são destinados a classes, atributos e métodos devem ser camelCase ou with_underscore.

  • O loop for é ineficiente. E todo o método poderia ser recuado em uma aba menos.

Aqui está um código de exemplo, pep-8 e o messagedialog ainda precisa ser feito.

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
    
por Timo 03.07.2012 / 15:24