![](/img/trans.png)
[英]Why do I keep getting AttributeError: 'module' object has no attribute
[英](Python, Kivy) How do I define by button functions properly? I keep getting AttributeError: 'Dice' object has no attribute 'DisplayBox'
我正在从事一个随机骰子项目,这是python的新手(大约2个月前我开始自己学习),并认为这将是一个很好的初学者项目。 但是我一直无法将功能绑定到按钮上。 我不断收到AttributeError:“骰子”对象没有属性“ displaybox”。 我不太了解,因为我的Dice类中显然有一个displaybox对象。 谢谢你的帮助!
这是我的Python代码:
from random import randint
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.label import Label
class Dice(GridLayout):
def __init__(self, **kwargs):
super(Dice, self).__init__(**kwargs)
# Define Buttons and labels
d4btn = Button(text='D4',
bold = True,
on_press = self.rolld4)
d6btn = Button(text='D6',
bold = True)
d8btn = Button(text='D8',
bold = True)
d10btn = Button(text='D10',
bold = True)
d12btn = Button(text='D12',
bold = True)
d20btn = Button(text='D20',
bold = True)
displaybox = (Label(text=('You have not rolled, \n please select a number to roll.')))
infobox = (Label(text='Random Dice Project \nJoshua \n10/17/2017'))
# Create Buttons and Labels
self.add_widget(d4btn)
self.add_widget(d6btn)
self.add_widget(d8btn)
self.add_widget(d10btn)
self.add_widget(d12btn)
self.add_widget(d20btn)
self.add_widget(displaybox)
self.add_widget(infobox)
# Button Behavior
def rolld4(self, obj):
self.displaybox.text = print(str(randint(1,4)))
class DiceRollerApp(App):
def build(self):
return Dice()
if __name__ == '__main__':
DiceRollerApp().run()
这是我的Kivy代码:
#:kivy 1.10.0
<Dice>:
cols: 2
rows: 4
编辑:我已经完成了工作版本。 谢谢你的帮助!
我的建议是在kv文件中定义所有小部件,并使用ObjectProperty连接到显示框。 有关详细信息,请参见以下示例。
from random import randint
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
class Dice(GridLayout):
displaybox = ObjectProperty(None)
# Button Behavior
def rolld4(self):
self.displaybox.text = str(randint(1, 4))
class DiceRollerApp(App):
def build(self):
return Dice()
if __name__ == '__main__':
DiceRollerApp().run()
#:kivy 1.10.0
<MyButton@Button>:
bold: True
<Dice>:
displaybox: displaybox
cols: 2
rows: 4
MyButton:
text: "D4"
on_press: root.rolld4()
MyButton:
text: "D6"
MyButton:
text: "D8"
MyButton:
text: "D10"
MyButton:
text: "D12"
MyButton:
text: "D20"
Label:
id: displaybox
text: 'You have not rolled, \nplease select a number to roll.'
Label:
id: infobox
text: 'Random Dice Project \nJoshua \n10/17/2017'
在您的骰子的init()中,您需要将显示框实例化为骰子的属性,然后可以在按钮行为中对其进行操作,因此您的代码是正确的,只需添加self参数即可,一切正常
这是代码:
-kv:
<Dice>:
cols: 2
rows: 4
-py:
from kivy.app import App
from random import randint
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
class Dice(GridLayout):
def __init__(self, **kwargs):
super(Dice, self).__init__(**kwargs)
# Define Buttons and labels
d4btn = Button(text='D4',
bold = True,
on_press = self.rolld4)
d6btn = Button(text='D6',
bold = True)
d8btn = Button(text='D8',
bold = True)
d10btn = Button(text='D10',
bold = True)
d12btn = Button(text='D12',
bold = True)
d20btn = Button(text='D20',
bold = True)
#Here you instantiate it ass an attribute of the dice
self.displaybox = (Label(text=('You have not rolled, \n please select a number to roll.')))
infobox = (Label(text='Random Dice Project \nJoshua \n10/17/2017'))
# Create Buttons and Labels
self.add_widget(d4btn)
self.add_widget(d6btn)
self.add_widget(d8btn)
self.add_widget(d10btn)
self.add_widget(d12btn)
self.add_widget(d20btn)
#Then you add it to the layout
self.add_widget(self.displaybox)
self.add_widget(infobox)
# Button Behavior
def rolld4(self, obj):
self.displaybox.text = str(randint(1,4))
print(str(randint(1, 4)))
class DiceRollerApp(App):
def build(self):
return Dice()
if __name__ == '__main__':
DiceRollerApp().run()
证明:
希望我能帮上忙!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.