【发布时间】: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'。可能是因为myBoard是None属性,而不是小部件 -myBoard = ObjectProperty(None) -
纠正@eyllanesc 指出的错字后,您还应该删除不必要的
_disabled_count = 0。
标签: python python-3.x kivy kivy-language