Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 小部件在_init__方法内的宽度和高度_Python_Kivy - Fatal编程技术网

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]