我有一个空地布局,其中我有一个固定大小的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>
答案 0 :(得分:5)
在GTK 2.x中添加GtkAlignment作为您想要居中的对象的父级并对齐0.5(禁用填充)。
在3.x中,所有小部件都有xalign和yalign属性,设置为CENTER。
更新:从示例glade文件中,问题是未禁用填充;我太懒了,无法查找之前调用的属性,在GtkAlignment中这是xscale = 0.0 yscale = 0.0,这意味着不要扩展子项以填充可用空间。默认的xscale = 1.0 yscale = 1.0表示孩子将填充可用空间,因此居中不会做任何事情。
在示例Glade文件中,我还必须执行“添加父 - &gt;视口”以在滚动窗口和对齐之间添加视口。您应该在控制台上发出关于此的警告。
答案 1 :(得分:0)
修复了将使用所有可用空间,你需要的是在其中一个父节点上捕获resize事件,无论是视口还是固定,我的猜测是Viewport会更好用,然后,得到固定的大小,根据孩子的大小和固定的大小来移动它的孩子。
您可以使用视口,获取子窗口小部件或从DrawingArea获取父母。