7

私は 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 を使用しており、ホームディレクトリに明らかな GTK 関連の隠しディレクトリがないため、その設定がどこから来ているのか理解できません。

誰かが md.set_default_response() を提案する前に、それはまさに私が望むものではありません。ダイアログの作成後に md.set_default_response(gtk.RESPONSE_YES) を設定しようとしましたが、はい、「はい」ボタンが選択されますが、左側に「いいえ」が表示されます。

この動作がどこから来たのかを理解し、それを完全に修正したいと思います。

4

1 に答える 1

7

GTK+ C のソースを見て、ようやく答えが見つかりました。

GNOME ヒューマン インターフェイス ガイドラインでは、右端の肯定ボタンの使用が推奨されているようですが、Windows などのプラットフォームでは、最初に肯定が標準であるため、ボタンを処理する必要があるウィジェットでは、set_alternative_button_order() という関数を使用します。 gtk-alternative-button-order というグローバル設定が 1 に設定されている場合に備えて、ボタンを再配置します。

次に、答えの 2 番目の部分は、KDE ​​がWindows を模倣しようとしているということです。何を探す必要があるかを知っていたので、GTK を作成するために、KDE ​​内の /home/myuser/.kde/share/config/gtkrc-2.0:gtk-alternative-button-order = 1 に別の gtkrc-2.0 を見つけました。 KDE で実行されるアプリケーションは、GTK 以外のアプリケーションと可能な限り類似しています。

私のシステムで KDE を root として実行したことがなく、.kde/ ディレクトリにそのような設定がなかったので、root の動作が異なるのはそのためです。

この話の教訓は、何を取得しても、このタイプのダイアログではデフォルトのボタンを設定する必要があるということです。そうしないと、GTK がデフォルトで最初のボタンに設定され、一貫性のない動作が発生します。私の場合、通常の GTK では、プログラムを終了するためのデフォルトの答えは終了することではありませんでしたが、Windows または KDE では終了することでした。

私はそれが明確であり、これが同じ問題を抱えているプログラマーに役立つことを願っています.

于 2012-06-08T01:52:33.600 に答える