从 kivy 1.11.1 升级到 kivy 2.0.0 后,应用程序在启动时抛出错误。任何想法?

Posted

技术标签:

【中文标题】从 kivy 1.11.1 升级到 kivy 2.0.0 后,应用程序在启动时抛出错误。任何想法?【英文标题】:App throws error on start after upgrading from kivy 1.11.1 to kivy 2.0.0. Any idea? 【发布时间】:2021-07-15 16:17:44 【问题描述】:

我是一名业余编码员,通过 kivy 制作应用程序,由于某些原因,当我声明多个小部件实例时,某些小部件会导致应用程序失败。此问题仅在从 kivy 1.11.1 升级到 kivy 2.0.0 后才开始。这是导致问题的小部件之一:

<LineCircle1@Widget>:
    onSwitch: 1
    ringActivate: True
    myRadius: 100
    myColors: [[.1, 1, .1],[1, 0, .1]]
    myColorCurrent: [1, 0, .1]
    canvas:
        Color:
            rgb: self.myColorCurrent if self.ringActivate == True else self.myColors[1]
            a: root.onSwitch
        Line:
            width: 2 if self.ringActivate == True else self.myRadius
            circle:
                (root.center_x, root.center_y, root.myRadius) if root.ringActivate == True else (self.center_x, root.center_y, root.myRadius/5)
        Ellipse:
            size: (2*self.myRadius,2*self.myRadius) if root.ringActivate == True else (0.01,0.01)
            pos: self.center_x-root.myRadius,root.center_y-root.myRadius
    center: self.center

上述代码的第 9 行抛出“IndexError: list index out of range”,第 12 行抛出“GraphicException: Invalid width value, must be > 0”。这两个错误都是在升级到 kivy 2.0.0 后才出现的。

为了隔离问题,我创建了最小可行代码,可在下面的 github 链接中找到。如果只声明了一个 LineCircle1 实例,则应用程序可以工作。如果声明了两个 LineCircle1 实例,则会出现错误。任何帮助将不胜感激!!谢谢!

网址:https://github.com/Ealt1/myTestApp

【问题讨论】:

【参考方案1】:

我认为您的代码应该可以工作,但事实并非如此。一种解决方法是在 py 中声明 LineCircle1 类,并在其中定义一些属性:

class LineCircle1(Widget):
    myColors = ListProperty( [[.1, 1, .1], [1, 0, .1]] )
    myRadius = NumericProperty(100)

然后kv 变成:

<LineCircle1>:
    onSwitch: 1
    ringActivate: True
    myColorCurrent: [1, 0, .1]
    canvas:
        Color:
            rgb: self.myColorCurrent if self.ringActivate == True else self.myColors[0]
            a: root.onSwitch
        Line:
            width: 2 if self.ringActivate == True else self.myRadius
            circle:
                (root.center_x, root.center_y, root.myRadius) if root.ringActivate == True else (self.center_x, root.center_y, root.myRadius/5)
        Ellipse:
            size: (2*self.myRadius,2*self.myRadius) if root.ringActivate == True else (0.01,0.01)
            pos: self.center_x-root.myRadius,root.center_y-root.myRadius
    center: self.center

【讨论】:

以上是关于从 kivy 1.11.1 升级到 kivy 2.0.0 后,应用程序在启动时抛出错误。任何想法?的主要内容,如果未能解决你的问题,请参考以下文章

在kivy中禁用弹跳滚动效果

kivy按钮图像显示问题

在 Windows 10 上安装 Kivy 的问题

安装kivy Python 3.8.3 [重复]

Kivy应用程序中的严重运动模糊。可能的错误?

将文本从文本输入传递到 Kivy 中的标签