实现定时器时出现 AttributeError
AttributeError while Implementing a timer
我正在尝试在我的对象游戏中实现一个计时器,但它总是给我:
File "/home/nabeel/Desktop/game/ProjectGame/main.py", line 71, in call
self.time_number = str(22)
AttributeError: 'float' object has no attribute 'time_number'
我不明白为什么会这样?
The .py file
__version__ = "1.0"
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.image import Image
from kivy.config import Config
from kivy.clock import Clock
from kivy.properties import StringProperty
from kivy.graphics.instructions import InstructionGroup
from kivy.graphics.context_instructions import Color
import random
Config.set('graphics', 'width', '480')
Config.set('graphics', 'height', '320')
ImagesList = ['calculator','cards','facebook','fly','glasses','keys','mouse','wallet','webcam','pen']
running = True
class ImgButton(Button):
pass
class ListLabel(Label):
pass
class MyWidget(AnchorLayout):
level = 1
LOC = []
for i in range (10):
LOC.append((random.randint(50,400),random.randint(0,260)))
num = 9
b_G_IMG = StringProperty("Level1/B_image1.png")
time = 40
time_number = StringProperty("")
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
self.time_number = str(self.time)
def remove_rectangle(self, widget):
if self.num > 0:
self.grid_layout.remove_widget(widget)
self.num -= 1
else:
self.level += 1
self.set_level(self.level)
self.num = 9
for i in range(9):
new_image = ImgButton(background_normal= "Level1/"+str(ImagesList[i])+".png", pos = self.LOC[i])
self.grid_layout.add_widget(new_image)
new_image.bind(on_press=self.remove_rectangle)
new_label = ListLabel(text=ImagesList[i],pos_y=(120+(i*10)))
self.grid_layout.add_widget(new_label)
def set_level(self,level):
self.b_G_IMG = "Level"+str(level)+"/B_image"+str(level)+".png"
def call(self):
self.time = self.time + 1
self.time_number = str(self.time)
Clock.schedule_interval(call, 1)
def ticked(self):
self.time_number = 50
running=False
class WidgetsApp(App):
def build(self):
return MyWidget()
if __name__=="__main__":
WidgetsApp().run()
The .kv file
<ListLabel@Label>
halign:'left'
font_size:15
markup:True
<ImgButton@Button>:
size_hint:(None,None)
size:(60,60)
<MyWidget>:
grid_layout: grid_layout
AnchorLayout:
BoxLayout:
Image:
source:root.b_G_IMG
FloatLayout:
Label:
pos:(-200,120)
font_size: 33
text:':50'
FloatLayout:
ListLabel:
pos:(-200,20)
text:'[color=000000]Calculator[/color]'
ListLabel:
pos:(-200,10)
text:'[color=000000]Cards[/color]'
ListLabel:
pos:(-200,0)
text:'[color=000000]facebook[/color]'
ListLabel:
pos:(-200,-10)
text:'[color=000000]fly[/color]'
ListLabel:
pos:(-200,-20)
text:'[color=000000]glasses[/color]'
ListLabel:
pos:(-200,-30)
text:'[color=000000]keys[/color]'
ListLabel:
pos:(-200,-40)
text:'[color=000000]mouse[/color]'
ListLabel:
pos:(-200,-50)
text:'[color=000000]wallet[/color]'
ListLabel:
pos:(-200,-60)
text:'[color=000000]webcam[/color]'
ListLabel:
pos:(-200,-70)
text:'[color=000000]Pen[/color]'
FloatLayout:
size:(480,320)
size_hint:(480,320)
id: grid_layout
ImgButton:
pos:(root.LOC[0])
background_normal: 'Level1/pen.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[1])
background_normal: 'Level1/cards.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[2])
background_normal: 'Level1/calculator.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[3])
background_normal: 'Level1/fly.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[4])
background_normal: 'Level1/glasses.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[5])
background_normal: 'Level1/keys.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[6])
background_normal: 'Level1/mouse.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[7])
background_normal: 'Level1/wallet.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[8])
background_normal: 'Level1/webcam.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[9])
background_normal: 'Level1/matches.png'
on_press: root.remove_rectangle(widget=self)
在__init__
方法中启动时钟,并将self.call
(而不仅仅是call
)传递给schedule_interval
。
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
self.time_number = str(self.time)
Clock.schedule_interval(self.call, 1)
这样,您传递给 schedule_interval
的方法将绑定到这个特定的 MyWidget
对象,并且该对象将作为第一个参数传递给 call
。您还需要向 self.call
添加一个 dt
(增量时间)参数,因为 one will be passed to the callback。 (您可以忽略方法中的参数)。
def call(self, dt):
self.time = self.time + 1
self.time_number = str(self.time)
我正在尝试在我的对象游戏中实现一个计时器,但它总是给我:
File "/home/nabeel/Desktop/game/ProjectGame/main.py", line 71, in call
self.time_number = str(22)
AttributeError: 'float' object has no attribute 'time_number'
我不明白为什么会这样?
The .py file
__version__ = "1.0"
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.image import Image
from kivy.config import Config
from kivy.clock import Clock
from kivy.properties import StringProperty
from kivy.graphics.instructions import InstructionGroup
from kivy.graphics.context_instructions import Color
import random
Config.set('graphics', 'width', '480')
Config.set('graphics', 'height', '320')
ImagesList = ['calculator','cards','facebook','fly','glasses','keys','mouse','wallet','webcam','pen']
running = True
class ImgButton(Button):
pass
class ListLabel(Label):
pass
class MyWidget(AnchorLayout):
level = 1
LOC = []
for i in range (10):
LOC.append((random.randint(50,400),random.randint(0,260)))
num = 9
b_G_IMG = StringProperty("Level1/B_image1.png")
time = 40
time_number = StringProperty("")
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
self.time_number = str(self.time)
def remove_rectangle(self, widget):
if self.num > 0:
self.grid_layout.remove_widget(widget)
self.num -= 1
else:
self.level += 1
self.set_level(self.level)
self.num = 9
for i in range(9):
new_image = ImgButton(background_normal= "Level1/"+str(ImagesList[i])+".png", pos = self.LOC[i])
self.grid_layout.add_widget(new_image)
new_image.bind(on_press=self.remove_rectangle)
new_label = ListLabel(text=ImagesList[i],pos_y=(120+(i*10)))
self.grid_layout.add_widget(new_label)
def set_level(self,level):
self.b_G_IMG = "Level"+str(level)+"/B_image"+str(level)+".png"
def call(self):
self.time = self.time + 1
self.time_number = str(self.time)
Clock.schedule_interval(call, 1)
def ticked(self):
self.time_number = 50
running=False
class WidgetsApp(App):
def build(self):
return MyWidget()
if __name__=="__main__":
WidgetsApp().run()
The .kv file
<ListLabel@Label>
halign:'left'
font_size:15
markup:True
<ImgButton@Button>:
size_hint:(None,None)
size:(60,60)
<MyWidget>:
grid_layout: grid_layout
AnchorLayout:
BoxLayout:
Image:
source:root.b_G_IMG
FloatLayout:
Label:
pos:(-200,120)
font_size: 33
text:':50'
FloatLayout:
ListLabel:
pos:(-200,20)
text:'[color=000000]Calculator[/color]'
ListLabel:
pos:(-200,10)
text:'[color=000000]Cards[/color]'
ListLabel:
pos:(-200,0)
text:'[color=000000]facebook[/color]'
ListLabel:
pos:(-200,-10)
text:'[color=000000]fly[/color]'
ListLabel:
pos:(-200,-20)
text:'[color=000000]glasses[/color]'
ListLabel:
pos:(-200,-30)
text:'[color=000000]keys[/color]'
ListLabel:
pos:(-200,-40)
text:'[color=000000]mouse[/color]'
ListLabel:
pos:(-200,-50)
text:'[color=000000]wallet[/color]'
ListLabel:
pos:(-200,-60)
text:'[color=000000]webcam[/color]'
ListLabel:
pos:(-200,-70)
text:'[color=000000]Pen[/color]'
FloatLayout:
size:(480,320)
size_hint:(480,320)
id: grid_layout
ImgButton:
pos:(root.LOC[0])
background_normal: 'Level1/pen.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[1])
background_normal: 'Level1/cards.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[2])
background_normal: 'Level1/calculator.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[3])
background_normal: 'Level1/fly.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[4])
background_normal: 'Level1/glasses.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[5])
background_normal: 'Level1/keys.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[6])
background_normal: 'Level1/mouse.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[7])
background_normal: 'Level1/wallet.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[8])
background_normal: 'Level1/webcam.png'
on_press: root.remove_rectangle(widget=self)
ImgButton:
pos:(root.LOC[9])
background_normal: 'Level1/matches.png'
on_press: root.remove_rectangle(widget=self)
在__init__
方法中启动时钟,并将self.call
(而不仅仅是call
)传递给schedule_interval
。
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
self.time_number = str(self.time)
Clock.schedule_interval(self.call, 1)
这样,您传递给 schedule_interval
的方法将绑定到这个特定的 MyWidget
对象,并且该对象将作为第一个参数传递给 call
。您还需要向 self.call
添加一个 dt
(增量时间)参数,因为 one will be passed to the callback。 (您可以忽略方法中的参数)。
def call(self, dt):
self.time = self.time + 1
self.time_number = str(self.time)