Python 小部件在_init__方法内的宽度和高度
我想为掷骰子游戏构建一个自定义小部件。 我正在设置一个数值Python 小部件在_init__方法内的宽度和高度,python,kivy,Python,Kivy,我想为掷骰子游戏构建一个自定义小部件。 我正在设置一个数值NumericProperty,其值从1到6。 我希望小部件根据此属性绘制。 我在kivy文件中使用min(self.width,self.height)为一个侧面绘制矩形,效果很好。但是因为点需要更多 处理我决定在python文件中,在\uuuuu init\uuuu方法中进行处理。问题是,当我尝试使用窗口小部件的宽度和高度来正确定位点时,我得到的宽度和高度为100px,与窗口大小不匹配。(我的小部件是根) 我正在阅读文档,其中解释说1
NumericProperty
,其值从1到6。
我希望小部件根据此属性绘制。
我在kivy文件中使用min(self.width,self.height)
为一个侧面绘制矩形,效果很好。但是因为点需要更多
处理我决定在python文件中,在\uuuuu init\uuuu
方法中进行处理。问题是,当我尝试使用窗口小部件的宽度和高度来正确定位点时,我得到的宽度和高度为100px,与窗口大小不匹配。(我的小部件是根)
我正在阅读文档,其中解释说100px是小部件的默认大小,在“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)]
#main.py
随机输入
从kivy.app导入应用程序
从kivy.uix.widget导入widget
从kivy.properties导入NumericProperty
从kivy.graphics导入行
类小部件(小部件):
number=NumericProperty(random.randint(1,6))
d_宽度=数值属性()
点图={
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’),
}
定义初始(自我,**kwargs):
Widget.\uuuu初始化(self,**kwargs)
自宽=最小值(自宽、自高)
self.dots_pos={
‘tl’:(self.d_宽度*0.2,self.d_宽度*0.8),
‘tr’:(self.d_宽度*0.8,self.d_宽度*0.8),
“cl”:(自焊盘宽度*0.2,自焊盘宽度*0.5),
‘c’:(自d_宽度*0.5,自d_宽度*0.5),
‘cr’:(自焊盘宽度*0.8,自焊盘宽度*0.5),
“bl”:(自深部宽度*0.2,自深部宽度*0.2),
‘br’:(self.d_宽度*0.8,self.d_宽度*0.2),
}
self.draw_dots()
def绘制点(自身):
位置=自身点\映射[自身编号]
使用self.canvas:
对于职位中的职位:
x、 y=自身点位置[位置]
直线(圆=(x,y,8))
def辊(自身):
数字集(随机随机随机数(1,6))
类应用程序(应用程序):
def生成(自):
返回widget()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
DiceApp().run()
#dice.kv
:
画布:
行:
矩形:
[self.x,self.y,min(self.width,self.height),
最小值(自宽、自高)]
你可以在你的班级里等待宽度和/或高度上的事件,但既然你想要这两个,只需等待大小
class DiceWidget(Widget):
def __init__(self, **kwargs):
# elided
def on_size(self, sender, value):
width = value[0]
height = value[1]