繁体   English   中英

(Python,Kivy)如何正确定义按钮功能? 我不断收到AttributeError:“骰子”对象没有属性“ DisplayBox”

[英](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连接到显示框。 有关详细信息,请参见以下示例。

main.py

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()

diceroller.kv

#: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()

证明:

图片1

图片2

希望我能帮上忙!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM