2012-06-08 6 views
6

Sto eseguendo il debug di un bug di esperienza utente in un programma PyGTK (anche se probabilmente la domanda sarà applicabile anche a GTK) e improvvisamente mi sono reso conto che il bug è "attivato" a seconda dell'utente che esegue il programma.Perché l'ordine dei pulsanti e il pulsante predefinito cambiano con l'utente che esegue un programma PyGTK/GTK?

ho ridotto il problema a uno script molto semplice in PyGTK:

import gtk 

class PyApp(gtk.Window): 
    def __init__(self): 
     super(PyApp, self).__init__() 

     self.set_size_request(250, 100) 
     self.set_position(gtk.WIN_POS_CENTER) 
     self.connect("destroy", gtk.main_quit) 
     self.set_title("Message dialogs") 

     ques = gtk.Button("Question") 
     self.add(ques) 

     ques.connect("clicked", self.on_ques) 

     self.show_all() 

    def on_ques(self, widget): 
     md = gtk.MessageDialog(self, 
      gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, 
      gtk.BUTTONS_YES_NO, "Are you sure to quit?") 
     md.run() 
     md.destroy() 

PyApp() 
gtk.main() 

Quando eseguo questo sulla mia macchina come me, ho questa finestra di dialogo:

Are you sure to quit? 
    <Yes> No 

Quando eseguo questo su la mia scatola come radice, ottengo questa finestra di dialogo:

Are you sure to quit? 
    <No> Yes 

entrambi gli utenti ettari Ho lo stesso file .gtkrc-2.0, e io uso KDE e non ho nulla di ovvio nella directory nascosta relativa a GTK nel mio homedir, quindi non riesco a capire da dove viene questa preferenza.

Prima che qualcuno suggerisca md.set_default_response(), non è esattamente quello che voglio. Ho provato a impostare md.set_default_response (gtk.RESPONSE_YES) dopo aver creato la finestra di dialogo, e sì, il pulsante "Sì" viene selezionato, ma ancora il "No" è stampato sulla sinistra.

Mi piacerebbe capire da dove proviene questo comportamento e provare a risolverlo una volta per tutte.

risposta

7

Guardando le sorgenti GTK + C ho finalmente trovato la risposta.

Sembra che le linee guida di GNOME Human Interface sostengano l'uso del pulsante affermativo all'estrema destra, ma in piattaforme come Windows, lo standard è affermativo in primo luogo, quindi nei widget che hanno a che fare con i pulsanti si ha una funzione chiamata set_alternative_button_order() che riorganizzare i pulsanti nel caso in cui un ambiente globale chiamato gtk-alternative-button-ordine impostato su 1.

Poi la seconda parte della risposta è che KDE cerca di imitare di Windows. Sapendo cosa dovevo cercare, ho trovato un altro gtkrc-2.0 in KDE, in /home/myuser/.kde/share/config/gtkrc-2.0:gtk-alternative-button-order = 1, per rendere il GTK applicazioni in esecuzione con KDE il più possibile simili a quelle non GTK.

Ecco perché root ha avuto un comportamento diverso, perché non ho mai eseguito KDE come root nel mio sistema e non aveva tale impostazione nella directory .kde /.

La morale della storia è che si must imposta il pulsante predefinito in questo tipo di finestre di dialogo, non importa quello che si ottiene, o in altro modo GTK predefinita sarà il primo, e questo porterà ad un comportamento incoerente. Nel mio caso, in semplice GTK la risposta predefinita per uscire dal programma non era quella di farlo, ma in Windows o KDE doveva uscire.

Spero sia chiaro e questo aiuta qualsiasi programmatore che ha lo stesso problema.

Problemi correlati