在父窗口小部件中居中固定大小的GtkDrawingArea窗口小部件

sle*_*ate 2 python gtk pygtk glade gtkbuilder

我有一个林间布局,其中我有一个固定大小的GtkDrawingArea.层次结构的当前相关部分是:

GtkWindow > GtkVBox > GtkHPaned > GtkViewport > GtkAlignment > GtkFixed > GtkDrawingArea
Run Code Online (Sandbox Code Playgroud)

目前,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()
Run Code Online (Sandbox Code Playgroud)

以及具有相同问题的示例glade文件:

<?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>
Run Code Online (Sandbox Code Playgroud)

最后......问题的示例图像...... Screeshot @ imgur

Hav*_*c P 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文件中,我还必须执行"添加父 - >视口"以在滚动窗口和对齐之间添加视口.您应该在控制台上有关于此的警告.