2

pygtkダイアログを使用しています。ボタンを追加しましたが、ボタンの位置を制御したいと思います。たとえば、中央に配置します。

これが私のコードです:

import pygtk
pygtk.require('2.0')
import gtk

dlg = gtk.Dialog('Marker Label')
dlg.set_size_request(350, 300)
dlg.show()

entry = gtk.Entry()
entry.show()
entry.set_activates_default(gtk.TRUE)
dlg.vbox.pack_start(entry)

# Create a centering alignment object
align = gtk.Alignment(0.5, 0.5, 0, 0)

button = dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)

align.add(button)
dlg.vbox.pack_start(align, False, False, 5)
dlg.set_default_response(gtk.RESPONSE_OK)
response = dlg.run()

if response == gtk.RESPONSE_OK:
    label = entry.get_text()
    print label
dlg.destroy()

私はこのメッセージを受け取っています:

test.py:19:GtkWarning:タイプGtkButtonのウィジェットをタイプGtkAli gnmentのコンテナーに追加しようとしていますが、ウィジェットはすでにタイプGtkHButtonBoxのコンテナー内にあります。GTK+ FAQ(http://library.gnome.org/ ) devel / gtk-faq / stable /は、ウィジェットの親を変更する方法を説明しています。align.add(ボタン)

4

2 に答える 2

1

それが言うように、問題は、dlg.add_button()によって返されるボタンがすでに親を持っていることです-それはダイアログの下部にある水平ボタンボックスです。

FAQに従うことができます-ボタンをvboxに追加する前に、HButtonBoxからボタンを削除してください。(ヒント:どちらにしても、ダイアログを表示するように設定する前に、これらすべてを実行したいと思います)。hboxは「action_area」と呼ばれているようです。多分dlg.action_area.remove(button)

または、ボタンを自分で作成することもできます。dlg.add_button()を使用する代わりに、gtk.button_new_from_stock(gtk.STOCK_OK)を使用します。

[しかし、私はGtkプログラマーではなく、どちらの場合でもイベント処理がどのように機能するかわかりません。つまり、ボタンを押したときにこれらのいずれかがダイアログを閉じるかどうか、またはそれを行うためにさらに何かを追加する必要があるかどうかはわかりません。Gtkのドキュメントは確かに私にその印象を与えています...]

于 2012-07-21T10:33:44.343 に答える
0

あなたは正しい道を歩んでいました。gtk.Alignment でボタン ボックス (action_area) を移動するだけです。

通常どおりダイアログを作成し、次を追加します。

align_action_area = gtk.Alignment(xalign=0.5, yalign=0.0, xscale=0.0, yscale=0.0)
dialog.vbox.pack_end(child=align_action_area)
dialog.action_area.reparent(new_parent=align_action_area)
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.show_all()

注: set_default_response() は reparent() の後に呼び出す必要があります。そうしないと、デフォルトのアクティブ化機能が機能しません。

コードで、次を置き換えます。

align.add(button)
dlg.vbox.pack_start(align, False, False, 5)

と:

dlg.vbox.pack_end(child=align, expand=False, fill=False, padding=5)
dlg.action_area.reparent(new_parent=align)
dlg.show_all()
于 2014-02-08T00:07:33.633 に答える