我想为骰子滚动游戏构建一个自定义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)]