【问题标题】:Python/Kivy Crash on add_widget function [closed]add_widget 函数上的 Python/Kivy 崩溃 [关闭]
【发布时间】:2019-08-12 03:11:38
【问题描述】:

公平的警告,我是 Python 和 Kivy 的新手,所以我可能做的事情很明显是错误的。我正在尝试使用 Python/Kivy 动态创建网格。错误发生在这一行:

for c in range(rows):
    for d in range(cols):
        self.myBoard.add_widget(BoardSquare(x=c+1,y=d+1)) #Error occurs this line

我最初收到与 _disabled_count 相关的错误。在此guidance 之后,我将_disabled_count 设置为零。现在它运行了,但随后在本机 Kivy add_widget 函数中崩溃。它似乎停在这里:

if index == 0 or len(self.children) == 0:
   self.children.insert(0, widget)
   canvas.add(widget.canvas)

在这里,canvas.add 操作上的代码失败。应用程序整体崩溃,Python 解释器不会生成错误字符串。唯一打印的项目是:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

根据其他研究,我了解到这表明存在某种分段违规,但我不知道如何解决这个问题。非常感谢您提供的任何帮助。

我正在运行 Python 3.7/Kivy 1.11/Max OSX

下面的完整代码供参考。

main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty, ListProperty, StringProperty
from kivy.clock import Clock
from kivy.graphics import Color
from kivy.uix.gridlayout import GridLayout

class BoardSquare(Widget):
    myLabel = StringProperty("")
    myX = NumericProperty(0)
    myY = NumericProperty(0)
    myCoord = ReferenceListProperty(myX,myY)
    cor = ListProperty((1,1,.5,1))
    _disabled_count = 0                    #Added to circumvent _disabled_count error

    def __init__(self, x, y, **kwargs):
        super(Widget, self).__init__(**kwargs)
        self.myX = x
        self.myY = y
        self.myLabel = str(self.myX) + str(self.myY)

class Board(GridLayout):
    myRows = NumericProperty(0)
    myCols = NumericProperty(0)

    def __init__(self, **kwargs):
        super(Board, self).__init__(**kwargs)
        self.myRows = 5
        self.myCols = 5

    def resize(self, r, c):
        self.myCols = c
        self.myRows = r

class FieldCommand(Widget):
    myBoard = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(FieldCommand, self).__init__(**kwargs)
        rows = 5
        cols = 5
        self.myBoard.resize(r = rows, c = cols)

        for c in range(rows):
            for d in range(cols):
                self.myBoard.add_widget(BoardSquare(x=c+1,y=d+1)) #Error occurs this line



class FieldCommandApp(App):
    def build(self):
        return FieldCommand()


if __name__ == '__main__':
    FieldCommandApp().run()

FieldCommand.kv

#:kivy 1.11.1

<BoardSquare>:
    canvas:
        Color:
            rgba: 1, .5, 1, 1
        Rectangle:
            size: self.size
            pos: self.pos

    Label:
        font_size: 10
        top: self.top - 2
        left: self.left + 2
        text: self.myLabel

<Board>:
    size: 1000,1000
    padding: '2sp'
    canvas:
        Color:
            rgba: 1,1,1,1
        Rectangle:
            size: self.size
            pos: self.pos
    size_hint: 1, None

<FieldCommand>:
    myBoard: aBoard

    canvas:

    Label:
        font_size: 50
        center_x: root.width/2
        top: root.top - 5
        text: "Field Command"

    Board:
        id: aBoard
        center: self.parent.center
        cols: self.myRows
        rows: self.myCols
        spacing: 20,20

【问题讨论】:

  • 错字:将super(Widget, self).__init__(**kwargs)更改为super(BoardSquare, self).__init__(**kwargs)
  • 感谢您的耐心等待。这让我通过了分段错误。
  • 可能你可以在所有课程中使用super().__init__(**kwargs)
  • 您的代码在 Linux 上运行不会崩溃,但会给出不同的错误:self.myBoard.resize(r = rows, c = cols) AttributeError: 'NoneType' object has no attribute 'resize'。可能是因为 myBoardNone 属性,而不是小部件 - myBoard = ObjectProperty(None)
  • 纠正@eyllanesc 指出的错字后,您还应该删除不必要的_disabled_count = 0

标签: python python-3.x kivy kivy-language


【解决方案1】:

如上面的 cmets 所示,我在 Super 参数调用中使用了错误的参数。

我将所有调用更改为:super().__init__(**kwargs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2012-11-27
    • 2015-09-13
    相关资源
    最近更新 更多