gtk - 为什么按钮和默认按钮的顺序会随着用户执行 PyGTK/GTK 程序而改变?

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

当我自己在我的盒子上运行它时,我得到了这个对话框:
Are you sure to quit?
    <Yes>   No

当我以 root 身份在我的机器上运行它时,我得到这个对话框:
Are you sure to quit?
     <No>   Yes

两个用户都有相同的 .gtkrc-2.0 文件,我使用 KDE 并且在我的 homedir 中没有任何明显的与 GTK 相关的隐藏目录,所以我不明白这种偏好来自哪里。

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

我想了解这种行为的来源,并尝试一劳永逸地修复它。

最佳答案

查看 GTK+ C 源代码,我终于找到了答案。

GNOME 人机界面指南似乎提倡使用最右侧的肯定按钮,但是在像 Windows 这样的平台中,标准首先是肯定的,因此在必须处理按钮的小部件中,您有一个名为 set_alternative_button_order() 的函数重新排列按钮以防名为 gtk-alternative-button-order 的全局设置设置为 1。

那么答案的第二部分是 KDE 试图模仿 Windows。知道我必须寻找什么后,我在 KDE 中找到了另一个 gtkrc-2.0,在/home/myuser/.kde/share/config/gtkrc-2.0:gtk-alternative-button-order = 1,为了使 GTK在 KDE 下运行的应用程序尽可能类似于非 GTK 的应用程序。

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

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

我希望它很清楚,这可以帮助任何遇到相同问题的程序员。

关于gtk - 为什么按钮和默认按钮的顺序会随着用户执行 PyGTK/GTK 程序而改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941603/

相关文章:

python - python中gtk.DrawingArea的透明背景

python - 使用 gtk 对话框选择器小部件列出远程目标的文件

python - 一个学习python的好的辅助项目?

python - 在 PyGTK 中获取要阻止的接口(interface)

python - 在组合框下拉菜单中显示日历

c - 显示 GTK 调试日志消息

gtk布局技术与glade

python - Python Gtk+3 中的排序和过滤树模型..?

c - 如何在 Make 中使用 pkg-config

calendar - GTK 下拉日历小部件?