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() 返回的按钮已经有一个父级 - 这是对话框底部的水平按钮框。

您可以按照常见问题解答 - 在尝试将其添加到您的 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 回答