__init__方法

时间:2017-05-30 14:39:28

标签: python kivy

我想为骰子滚动游戏构建一个自定义Widget。 我设置的数字NumericProperty的值为1到6。 我想根据这个属性绘制小部件。 我正在使用min(self.width, self.height)绘制kivy文件中的矩形,它可以正常工作。但因为点需要更多 处理我决定在__init__方法内的python文件中执行此操作。问题是,当我尝试使用窗口小部件的宽度和高度以正确定位点时,我获得100px的宽度和高度不会影响窗口的大小。 (我的小部件是根) 我正在阅读文档,并解释说100px是Widget的默认大小,而且内部" init "它尚未更新为父级的大小。 现在我想知道是否有另一个地方我可以绘制点,并且小部件的大小已经更新。我在kivy文件中看到我得到了我想要的行为,但是我无法使用.kv文件来绘制点,因为我不熟悉kivy语言。 有人可以帮忙吗?

# main.py
import random
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.graphics import Line

class DiceWidget(Widget):
    number = NumericProperty(random.randint(1, 6))
    d_width = NumericProperty()
    dots_map = {
        1: ('c'),
        2: ('bl', 'tr'),
        3: ('bl', 'c', 'tr'),
        4: ('bl', 'br', 'tl', 'tr'),
        5: ('bl', 'br', 'c', 'tl', 'tr'),
        6: ('bl', 'br', 'cl', 'cr', 'tl', 'tr'),
    }

    def __init__(self, **kwargs):
        Widget.__init__(self, **kwargs)
        self.d_width = min(self.width, self.height)
        self.dots_pos = {
            'tl': (self.d_width*0.2, self.d_width*0.8),
            'tr': (self.d_width*0.8, self.d_width*0.8),
            'cl': (self.d_width*0.2, self.d_width*0.5),
            'c' : (self.d_width*0.5, self.d_width*0.5),
            'cr': (self.d_width*0.8, self.d_width*0.5),
            'bl': (self.d_width*0.2, self.d_width*0.2),
            'br': (self.d_width*0.8, self.d_width*0.2),
        }
        self.draw_dots()

    def draw_dots(self):
        positions = self.dots_map[self.number]
        with self.canvas:
            for position in positions:
                x, y = self.dots_pos[position]
                Line(circle=(x, y, 8))

    def roll(self):
        number.set(random.randint(1,6))

class DiceApp(App):
    def build(self):
        return DiceWidget()

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



# dice.kv
<DiceWidget>:
    canvas:
        Line:
            rectangle:
                [self.x, self.y, min(self.width, self.height), 
                                 min(self.width, self.height)]

0 个答案:

没有答案