2

私は空き地レイアウトを進めており、その中に固定サイズの 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>

そして最後に...問題のサンプル画像... スクリーンショット @ imgur

4

2 に答える 2

7

GTK 2.x では、GtkAlignment を、中央に配置して 0.5 に揃えたいものの親として追加します (塗りつぶしを無効にします)。

3.x では、すべてのウィジェットに xalign および yalign プロパティがあり、CENTER に設定されています。

更新:サンプルの空き地ファイルから、問題は塗りつぶしが無効になっていないことです。プロパティが以前に呼び出されたものを調べるのが面倒でした。GtkAlignment では、これは xscale=0.0 yscale=0.0 です。これは、使用可能なスペースを埋めるために子を拡張しないことを意味します。デフォルトの xscale=1.0 yscale=1.0 は、子が使用可能なスペースを埋めるため、センタリングは何もしないことを意味します。

サンプル Glade ファイルでは、スクロールされたウィンドウと配置の間にビューポートを追加するために、「親を追加 -> ビューポートを追加」も実行する必要がありました。これについて、コンソールに警告が表示されるはずです。

于 2011-04-23T17:07:18.893 に答える
0

Fixed は使用可能なすべてのスペースを使用します。ここで必要なのは、ビューポートまたは Fixed のいずれかの親のサイズ変更イベントをキャッチすることです。私の推測では、Viewport がより適切に機能し、Fixed のサイズを取得して移動します。それは子供のサイズと固定のサイズに応じた子供です。

これは、Viewport を使用して子ウィジェットを取得するか、DrawingArea から親を取得して行うことができます。

于 2011-04-23T16:56:40.787 に答える