如何在Kivy中防止小部件的大小发生变化?

时间:2014-07-15 22:33:40

标签: python-3.x widget size kivy python-3.4

我一直在玩this代码,我发现了一些(可能)奇怪的事情:当我向我的班级添加父级时,大小更改为[100,100](请参阅注释):

from random import random, randint

import kivy

kivy.require('1.8.0')

from kivy.config import Config

Config.set('graphics', 'fullscreen', '0')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Line, Ellipse, Triangle, Rectangle


class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        with self.canvas:
            Color(random(), 1, 1, mode='hsv')
            touch.ud['line'] = Line(points=(self.width - touch.x, self.height - touch.y))
            print(self.width, self.height)  # It works OK if I return painter below, but it's not if I return parent.

    def on_touch_move(self, touch):
        touch.ud['line'].points += [self.width - touch.x, self.height - touch.y]


class Example(App):
    def build(self):
        parent = Widget()
        painter = MyPaintWidget()
        print(painter.size)  # Shows [100, 100] anyway.
        parent.add_widget(painter)
        return parent  # If I return painter, everything works as I want (except painter.size still shows [100, 100]).


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

为什么会这样?我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

(100, 100)是窗口小部件的默认大小。在这种情况下,你的画家有这么大的规模,因为你从来没有将它设置为其他任何东西。

即使它的父级是一个可以自动移动并调整画家大小的布局类,此时它的大小仍会读取(100,100),因为布局还没有时间运行。此时您通常不应该担心像素值 - 如果您需要其他东西依赖它们,请使用绑定在第一个更改时自动更新其他内容。这通过kv语言特别容易。