2012-06-08 8 views
6

Estoy depurando un error de experiencia de usuario en un programa PyGTK (aunque la pregunta probablemente también sea aplicable a GTK), y de repente me di cuenta de que el error se 'dispara' dependiendo del usuario que ejecuta el programa.¿Por qué el orden de los botones y el botón predeterminado cambian con el usuario que ejecuta un programa PyGTK/GTK?

que reduce la emisión de un guión muy simple en 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() 

Cuando ejecuto esto en mi caja como a mí mismo, me sale este cuadro de diálogo:

Are you sure to quit? 
    <Yes> No 

Cuando ejecuto esto en mi caja como raíz, me sale este cuadro de diálogo:

Are you sure to quit? 
    <No> Yes 

tanto a los usuarios de hectáreas Tengo el mismo archivo .gtkrc-2.0, y uso KDE y no tengo ningún directorio oculto relacionado con GTK obvio en mi directorio de inicio, por lo que no puedo entender de dónde viene esa preferencia.

Antes de que alguien sugiera md.set_default_response(), eso no es exactamente lo que quiero. Traté de establecer md.set_default_response (gtk.RESPONSE_YES) después de crear el cuadro de diálogo, y sí, se selecciona el botón 'Sí', pero el 'No' se imprime a la izquierda.

Me gustaría entender de dónde viene este comportamiento, y tratar de solucionarlo de una vez por todas.

Respuesta

7

Mirando las fuentes GTK + C finalmente encontré la respuesta.

Parece que las Directrices de Interfaz Humana de GNOME recomiendan el uso del botón afirmativo en el extremo derecho, pero en plataformas como Windows, el estándar es afirmativo primero, de modo que en los widgets que tienen que ocuparse de botones se tiene una función llamada set_alternative_button_order() que reorganizar los botones en el caso de una configuración global llamada GTK-alternativo-button-orden se establece en 1.

a continuación, la segunda parte de la respuesta es que KDE trata de imitar de Windows. Sabiendo lo que tenía que buscar, encontré otro gtkrc-2.0 dentro de KDE, en /home/myuser/.kde/share/config/gtkrc-2.0:gtk-alternative-button-order = 1, para hacer el GTK las aplicaciones que se ejecutan bajo KDE son lo más similares posibles a las que no son de GTK.

Es por eso que root tuvo un comportamiento diferente, porque nunca ejecuté KDE como root en mi sistema y no tenía esa configuración en el directorio .kde /.

La moraleja de la historia es que necesidad establecer el botón predeterminado en este tipo de diálogos, no importa lo que se obtiene, o de otra manera GTK pondrá por defecto a la primera, y esto dará lugar a un comportamiento inconsistente. En mi caso, en GTK simple, la respuesta predeterminada para salir del programa no era hacerlo, pero en Windows o KDE era para salir.

Espero que esté claro y esto ayuda a cualquier programador que tenga el mismo problema.

Cuestiones relacionadas