Как получить Gtk.DrawingArea для заполнения Gtk.Grid? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь нарисовать массив кругов в окне Gtk. Я могу нарисовать один в Gtk.DrawingArea, и когда DrawingArea является единственным объектом, он расширяется, чтобы соответствовать окну. Однако, когда я помещаю несколько в Gtk.Grid, они не раскрываются, чтобы заполнить Grid.

Как мне заставить их заполнить сетку?

Я просмотрел этот пост , который ссылался на эту страницу , но они не решили проблему (или мне не удалось понять концепцию).

Я попытался установить для свойств expand, hexpand, vexpand, hexpand_set и vexpand_set значение True, а для set_halign и set_valign - Gtk.Align.FILL - безрезультатно

Мои круги создаются с помощью CircleArea.py

from gi.repository import Gtk
import cairo
import math


class CircleArea(Gtk.DrawingArea):
    """Establishes the space for the circle and paints the circle in it"""

    def __init__(self):
        super(CircleArea, self).__init__()
        self.hexpand = True
        self.vexpand = True
        self.set_halign = Gtk.Align.FILL
        self.set_valign = Gtk.Align.FILL
        self.connect('draw', self.on_draw)

    def on_draw(self, widget, cr):
        height = widget.get_allocated_height()
        width = widget.get_allocated_width()
        smaller = width if width < height else height
        cr.set_source_rgb(self.red, self.green, self.blue)
        cr.arc(height / 2, width / 2, smaller * 0.45, 0, 2 * math.pi)
        cr.fill()

А само окно в Grid.py

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from CircleArea import CircleArea

class CircleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Circle Grid")
        self.set_border_width(10)

        self.grid = Gtk.Grid()
        self.circle_area1 = CircleArea()
        self.circle_area2 = CircleArea()
        self.grid.attach(self.circle_area1, 0, 0, 1, 1)
        self.grid.attach(self.circle_area2, 1, 0, 1, 1)
        self.add(self.grid)


win = CircleWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Я ожидаю, что круги заполнят доступное пространство сетки, но вместо этого они оба имеют размер 1x1.

1 Ответ

0 голосов
/ 17 апреля 2019

Моя проблема заключалась в том, что set_halign, set_valign, set_hexpand и set_vexpand являются методами, а не свойствами. Поэтому в CirleArea. init () я изменил код на:

def __init__(self):
        super(CircleArea, self).__init__()
        self.set_hexpand(True)
        self.set_vexpand(True)
        self.set_halign(Gtk.Align.FILL)
        self.set_valign(Gtk.Align.FILL)
        self.connect('draw', self.on_draw)
...