我已經有了一個空白區佈局,並且其中有一個固定大小的GtkDrawingArea。該層次結構的當前相關部分是:父窗口小部件中的中心固定大小的GtkDrawingArea小部件
GtkWindow > GtkVBox > GtkHPaned > GtkViewport > GtkAlignment > GtkFixed > GtkDrawingArea
目前,GtkFixed小部件繪製在GtkViewport的左上角。但是,如果GtkFixed(以及它的唯一子節點,GtkDrawingArea)在GtkViewport中居中(當然,除了當窗口小部件被壓縮到不適合它的點時,我真的很喜歡它內容和滾動條出現)。
完成此操作的最佳方法是什麼? (我使用pygtk的做實際的應用邏輯,但是這應該是一個普遍問題,GTK)
下面是一個代表性的代碼示例:
import gtk
class Controller:
def on_window1_destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file("sample.glade")
self.window = self.builder.get_object("window1")
self.builder.connect_signals(self)
def on_drawingarea1_expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgb(0,0,0)
cr.paint()
return True
if __name__ == "__main__":
client = Controller()
client.window.show()
gtk.main()
並用相同的問題的樣本空地文件:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<signal name="destroy" handler="on_window1_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<child>
<object class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<child>
<object class="GtkFixed" id="fixed1">
<property name="width_request">300</property>
<property name="height_request">300</property>
<property name="visible">True</property>
<child>
<object class="GtkDrawingArea" id="drawingarea1">
<property name="width_request">300</property>
<property name="height_request">300</property>
<property name="visible">True</property>
<signal name="expose_event" handler="on_drawingarea1_expose_event"/>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
</packing>
</child>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
我曾嘗試GtkAlignment,因爲您之前描述爲GtkFixed的父項,並未將小部件居中。 – sleepynate 2011-04-24 21:00:30
您可能需要發佈glade文件,以便人們可以看一看。 – 2011-04-25 02:12:34
我發佈了一個示例glade文件和一個匹配的python腳本,它描繪了我想保持居中黑色的區域。理想情況下,黑色繪圖區域將保持居中在其GtkViewport中。 – sleepynate 2011-04-25 15:43:55