web-dev-qa-db-fra.com

Comment implémenter un dialogue d'abandon dans Gtk3?

J'ai presque terminé mon application Ubuntu App Showdown, mais j'aimerais la rendre un peu plus robuste. À la fermeture de l'application, je parcours les fichiers ouverts en recherchant les fichiers non sauvegardés. S'il y en a, j'ouvre une boîte de dialogue informant l'utilisateur.

Ce que je voudrais, c’est que si l’utilisateur annule la boîte de dialogue, le programme reprend, mais si l’utilisateur clique sur OK, la boîte de dialogue et la fenêtre principale doivent se fermer.

C'est ce que j'ai jusqu'ici.

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

Lorsque la boîte de dialogue est exécutée, les valeurs ResponseType.OK ou ResponseType.CANCEL ne sont jamais sorties. Je reçois des nombres négatifs aléatoires tels que -4 ou -6, la boîte de dialogue ne se ferme jamais non plus et la fenêtre principale continue à émettre et nécessite un CTRL + c pour quitter. il.

3
Neil Munro

Il y a plusieurs problèmes avec ce code.

  • La méthode dialog.destroy () ne sera jamais appelée, vous retournez votre fonction avant cet appel.

  • Regardez le Gtk.MessageDialog. Il gérera le code standard dont vous avez besoin avec un Gtk.Dialog normal.

  • Lire PEP-8 . Ce n'est pas une règle, mais une pratique courante. Les noms UpperCase sont destinés aux classes, les attributs et les méthodes doivent être camelCase ou with_underscore.

  • La boucle for est inefficace. Et toute la méthode pourrait être indentée un onglet de moins.

Voici quelques exemples de code, pep-8, et le messagedialog doit encore être créé.

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
Timo