2012-07-21 61 views
1

我正在使用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的容器但是該小部件已經在類型爲GtkHButtonBox的容器內部,在http://library.gnome.org/devel/gtk-faq/stable/處的GTK + FAQ解釋瞭如何重置小部件。 align.add(按鈕)

回答

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文檔肯定給我的印象...]

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()必須重新設置父級之後,被稱爲(),否則默認激活功能將無法正常工作。

在你的代碼,替換:

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