python - Kivy - unable to run the game on widget that is added to second screen -
i have posted 2 posts same problem few days ago, still can't run.
i have 2 screens. 2 buttons on first screen (play , how play). second 1 want, first 1 begin game when released, change screen second screen (this works okay). have tried lot of things , errors snakewidget not being defined, not containing self , on.
that's error get:
file "c:\users\lara\desktop\kivy\lara\poskus.py", line 33, in <module> class gamescreen(screen): file "c:\users\lara\desktop\kivy\lara\poskus.py", line 34, in gamescreen snaky_game = snakewidget() nameerror: name 'snakewidget' not defined .py file:
import kivy kivy.app import app kivy.uix.screenmanager import screenmanager, screen, fadetransition kivy.uix.floatlayout import floatlayout kivy.uix.widget import widget kivy.uix.label import label kivy.uix.button import button kivy.uix.popup import popup kivy.vector import vector kivy.clock import clock kivy.lang import builder class rootscreen(screenmanager): pass class startscreen(screen): def show_popup(self): p = instructionspopup(content=label(text="instructions")) p.open() class gamescreen(screen): snaky_game = snakewidget() snaky_game.begin() clock.schedule_interval(self.update, 1.0 / 60.0) class instructionspopup(popup): pass class snakewidget(widget): snaky = objectproperty(none) def __init__(self, *args, **kwargs): super(snakewidget, self).__init__(*args, **kwargs) clock.schedule_interval(self.update, 1.0 / 60.0) def begin(self, vel=(4, 0)): self.snaky.center = self.center self.snaky.velocity = vel def update(self, dt): self.snaky.move() if (self.snaky.y < self.y) or (self.snaky.top > self.top): self.snaky.velocity_y *= -1 class snake(widget): velocity_x = numericproperty(0) velocity_y = numericproperty(0) velocity = referencelistproperty(velocity_x, velocity_y) def move(self): self.pos = vector(*self.velocity) + self.pos class poskusapp(app): def build(self): self.load_kv("poskus.kv") return rootscreen() if __name__ == "__main__": poskusapp().run() and .kv file:
#:import fadetransition kivy.uix.screenmanager.fadetransition <rootscreen>: id: screen_manager transition: fadetransition() startscreen: name: "start" gamescreen: name: "game" <startscreen>: floatlayout: name: "start" button: id: play text: "play!" size_hint: 0.4, 0.3 pos_hint: {'center_x':.5, 'center_y':.5} font_size: 70 on_release: root.manager.current = "game" button: id: how text: "how play" size_hint: 0.4, 0.1 pos_hint: {'center_x':.5, 'center_y':.3} font_size: 40 on_press: root.show_popup() <instructionspopup>: size_hint: .5, .5 title: "how play" <gamescreen>: name: "game" snakewidget: button: id: menu text: "menu" size_hint: 0.2, 0.1 pos_hint: {"x": 0.8,"y":0.9} font_size: 17 on_release: root.manager.current = "start" <snakewidget>: id: snake_widget snaky: snake canvas: rectangle: size: self.size pos: self.pos snake: id: snake center: self.parent.center <snake>: size: 50, 50 canvas: ellipse: pos: self.pos size: 40, 40 if can, please me because stuck , getting nowhere.
i think missed couple of python basics. explain in form of points.
1. forgot import properties used in python code.
from kivy.properties import numericproperty,referencelistproperty,objectproperty 2. need know how python interpreter works, it reads code top bottom, here class gamescreen defined before defining snakewidget class, when try make object of snakewidget class doesn't exists interpreter. shows error. nameerror: name 'snakewidget' not defined. basically, move class gamescreen below class snakewidget , shall fix error.
3. used self when tried schedule function. clock.schedule_interval(self.update, 1.0 / 60.0)
using self there method named update in same class instead of looking in snakewidget class.
class gamescreen(screen): snaky_game = snakewidget() snaky_game.begin() clock.schedule_interval(snaky_game.update, 1.0 / 60.0)
Comments
Post a Comment