Я хочу создать собственный виджет для игры в кости. Я устанавливаю число NumericProperty
, которое будет иметь значения от 1 до 6. Я хочу, чтобы виджет рисовался в соответствии с этим свойством. Я рисовал прямоугольник в файле kivy, используя min(self.width, self.height)
для стороны, и он работает нормально. Но поскольку точки требуют дополнительной обработки, я решил сделать это в файле python внутри метода __init__
. Проблема в том, что когда я пытаюсь использовать ширину и высоту виджета для правильного позиционирования точек, я получаю 100 пикселей для ширины и высоты независимо от размера окна. (Мой виджет является корневым). Я читал документацию, и там объясняется, что 100 пикселей — это размер виджета по умолчанию и что внутри «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)]