pygtk居中对话框按钮

时间:2012-07-21 09:46:09

标签: python dialog pygtk

我正在使用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类型的容器中,http://library.gnome.org/devel/gtk-faq/stable/的GTK + FAQ解释了如何重新创建小部件。     align.add(按钮)

2 个答案:

答案 0 :(得分:1)

正如它所说,问题是dlg.add_button()返回的按钮已经有一个父对象 - 它是对话框底部的水平按钮框。

您可以按照常见问题解答 - 在尝试将其添加到vbox之前从HButtonBox中删除该按钮。 (提示:无论哪种方式,我都认为你想在将对话框设置为可见之前完成所有这些操作)。看起来hbox被称为“action_area”。也许是dlg.action_area.remove(按钮)

或者您可以自己创建按钮。不使用dlg.add_button(),而是使用gtk.button_new_from_stock(gtk.STOCK_OK)。

[但我不是Gtk程序员,我不知道事件处理在两种情况下是如何工作的。即我不知道当你按下按钮时这些中的任何一个是否仍会关闭对话框,或者你是否还需要添加更多内容来做到这一点。 Gtk文档肯定给了我这样的印象......]

答案 1 :(得分: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()

注意:必须在reparent()之后调用set_default_response(),否则默认激活功能将无效。

在您的代码中,替换:

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