为什么用户执行PyGTK/GTK程序时按钮和默认按钮的顺序会发生变化?

End*_*der 6 gtk pygtk

我正在调试PyGTK程序中的用户体验错误(尽管问题可能也适用于GTK),并且突然意识到错误是"触发"的,具体取决于执行程序的用户.

我将问题简化为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()
Run Code Online (Sandbox Code Playgroud)

当我像我一样在我的盒子上运行时,我得到了这个对话框:

Are you sure to quit?
    <Yes>   No
Run Code Online (Sandbox Code Playgroud)

当我以root身份在我的盒子上运行它时,我得到这个对话框:

Are you sure to quit?
     <No>   Yes
Run Code Online (Sandbox Code Playgroud)

两个用户都有相同的.gtkrc-2.0文件,并且我使用KDE并且在我的homedir中没有任何明显的与GTK相关的隐藏目录,所以我无法理解该偏好来自何处.

在有人建议md.set_default_response()之前,这不是我想要的.我在创建对话框后尝试设置md.set_default_response(gtk.RESPONSE_YES),是的,选择"是"按钮,但左侧仍然打印"否".

我想了解这种行为的来源,并尝试一次性修复它.

End*_*der 7

看看GTK + C来源,我终于找到了答案.

似乎GNOME人机接口指南主张在最右边使用肯定按钮,但在像Windows这样的平台中,标准首先是肯定的,所以在必须处理按钮的小部件中,你有一个名为set_alternative_button_order()的函数,如果将名为gtk-alternative-button-order的全局设置设置为1,则重新排列按钮.

然后答案的第二部分是KDE 试图模仿Windows.知道了我要找的东西,我在/home/myuser/.kde/share/config/gtkrc-2.0:gtk-alternative-button-order = 1中找到了KDE中的另一个gtkrc-2.0,以便制作GTK在KDE下运行的应用程序尽可能与非GTK类似.

这就是为什么root有不同的行为,因为我从未在我的系统中以root身份运行KDE,并且在.kde /目录中没有这样的设置.

故事的寓意是你必须在这种类型的对话框中设置默认按钮,无论你得到什么,否则GTK将默认为第一个,这将导致不一致的行为.在我的情况下,在普通的GTK中,退出程序的默认答案不是这样做,而是在Windows或KDE中退出.

我希望它很清楚,这有助于任何程序员遇到同样的问题.