【问题标题】:Kivy rectangles are stuck at bottom leftKivy 矩形卡在左下角
【发布时间】:2021-03-18 14:52:09
【问题描述】:

我正在尝试将按钮添加到每个上方都有一个矩形形状的 kivy 网格布局。但是所有的矩形似乎都堆积在屏幕的左下角,离按钮不远。我认为正在创建多个矩形,但它们都被放置在彼此之上,而不是在按钮之上。我该如何解决?

main.py:

from kivymd.app import MDApp
from kivy.app import App
from kivy.graphics import Ellipse, Rectangle, Color
from kivy.uix.button import ButtonBehavior, Button
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.metrics import dp, sp

Window.size = (550, 730)


class Recta(Button):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        with self.canvas.after:
            Color(1., 1., 0)
            Rectangle(pos=self.pos, size=(self.width, self.height))


class Grid(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.rows = 8
        self.cols = 8
        self.size_hint = None, None

        if Window.height > Window.width:
            self.width = Window.width
            self.height = Window.width

        elif Window.height < Window.width:
            self.width = Window.height
            self.height = Window.height

        elif Window.height == Window.width:
            self.width = Window.width
            self.height = Window.height

        self.pos_hint = {"center_x": 0.5, "center_y": 0.5}

        for i in range(64):
            self.add_widget(Recta())


class TestApp(MDApp):
    def build(self):
        grid_w = Grid()
        return grid_w


if __name__ == '__main__':
    TestApp().run()

【问题讨论】:

    标签: python button kivy


    【解决方案1】:

    问题是您在__init__() 方法中使用possizeRecta 小部件绘制Rectangle。在__init__()中,一个widget的possize还没有设置,仍然是(0,0)(100,100)的默认值。

    您可以通过以下两种方式之一解决此问题。最简单的方法是使用kv 定义Rectangle,如下所示:

    Builder.load_string('''
    <Recta>:
        canvas.after:
            Color:
                rgb: 1,1,0
            Rectangle:
                pos: self.pos
                size: self.size
    ''')
    

    并从__init__() 方法中删除Rectangle 的绘图

    第二种方法是像这样创建绑定(kv 自动执行):

    class Recta(Button):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            with self.canvas.after:
                Color(1., 1., 0)
                self.rect = Rectangle(pos=self.pos, size=(self.width, self.height))
            self.bind(pos=self.update)
            self.bind(size=self.update)
    
        def update(self, *args):
            self.rect.pos = self.pos
            self.rect.size = self.size
    

    【讨论】:

    • 这很有见地,将其定义为 .kv 所做的翻译。由于整个 Kivy 工作流程,我正在将代码从 .kv 文件移植到纯 Python,但无法弄清楚如何正确绘制页面背景。
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多