2

占有できるスペースの量に応じて、GtkLayout のコンテンツを自動的に「ズームして合わせる」方法を探しています。

これが私の解決策です:

class MyLayout(Gtk.Layout):
    def __init__(self, document, **args):
        Gtk.Layout.__init__(self, **args)
        doc_width = 0
        doc_height = 0
        self.document = document

        # Determine the size of the document, I want to display
        for page in self.document.pages:
            doc_width = max(doc_width, page.width)
            doc_height += page.height
        self.aspect_ratio = doc_height / doc_width

        self.connect("draw", self.draw)

    def draw(self, widget, context):
        w = self.get_allocated_width()
        h = self.get_allocated_width()*self.aspect_ratio
        self.set_size(w, h) # sets the _content_ size, not the actual widget size
        print("draw")

残念ながら、これにより、ウィンドウのサイズが変更されるたびに draw() が 2 回呼び出されます。これは、実際にレイアウトに何かを描画する必要がある場合に時間がかかります。

この問題の正しい解決策は何ですか?

敬具、
ファビアン・ヘンツェ

解決策:少し前に解決策を見つけました。それは私のプロジェクトのここここにあります。そこから最小限の例を抽出する時間がありません。誰かがそれをやりたいと思っているなら、私はそれを答えとして喜んで受け入れます.

4

1 に答える 1

1

私の推測では、これは、親が子を複数回再描画し、階層オブジェクトによってトリガーされると問題になる可能性があります。

描画フローをより詳細に表示するために、例を拡張します。

from gi.repository import Gtk

class MyLayout(Gtk.Layout):
    def __init__(self, document, **args):
        Gtk.Layout.__init__(self, **args)
        doc_width = 0
        doc_height = 0
        self.document = document

        # Determine the size of the document, I want to display
        for page in self.document.pages:
            doc_width = max(doc_width, page.width)
            doc_height += page.height
        self.aspect_ratio = doc_height / doc_width

        self.connect("draw", self.draw)

    def do_realize(self):
        Gtk.Layout.do_realize(self)
        print ('do_realize')

    def do_show(self):
        Gtk.Layout.do_show(self)
        print ('do_show')

    def do_draw(self, widget):
        Gtk.Layout.do_draw(self, widget)
        print ('do_draw'), widget

    def draw(self, widget, context):
        print widget, context
        w = self.get_allocated_width()
        h = self.get_allocated_width() * self.aspect_ratio
        self.set_size(w, h) # sets the _content_ size, not the actual widget size
        print("draw")

class page(object):
    def __init__(self, width, height):
        self.width = width
        self.height = height

class document(object):
    def __init__(self):
        self.pages = [page(20, 10), page(40, 30)]

layout = MyLayout(document())
win = Gtk.Window()
layout.show()
win.add(layout)
win.show()
Gtk.main()

私にとっての出力は次のとおりです。

do_show
do_realize
<MyLayout object at 0xb6b0ef54 (__main__+MyLayout at 0x898e950)> <cairo.Context object at 0xb73237f0>
draw
do_draw <cairo.Context object at 0xb73237f0>
<MyLayout object at 0xb6b0ef54 (__main__+MyLayout at 0x898e950)> <cairo.Context object at 0xb73237f0>
draw
do_draw <cairo.Context object at 0xb73237f0>
<MyLayout object at 0xb6b0ef54 (__main__+MyLayout at 0x898e950)> <cairo.Context object at 0xb73237f0>
draw
do_draw <cairo.Context object at 0xb73237f0>
<MyLayout object at 0xb6b0ef54 (__main__+MyLayout at 0x898e950)> <cairo.Context object at 0xb73237f0>
draw
do_draw <cairo.Context object at 0xb73237f0>
<MyLayout object at 0xb6b0ef54 (__main__+MyLayout at 0x898e950)> <cairo.Context object at 0xb73237f0>
draw
do_draw <cairo.Context object at 0xb73237f0>

do_draw 内部ウィジェット関数よりも前に描画シグナルが発行され、複数回トリガーされていることがわかります。

于 2012-06-21T02:10:15.250 に答える