【问题标题】:Kivy - unable to run the game on widget that is added to second screenKivy - 无法在添加到第二个屏幕的小部件上运行游戏
【发布时间】:2015-07-08 18:05:31
【问题描述】:

几天前我发布了两篇关于相同问题的帖子,但我仍然无法运行它。

我有两个屏幕。第一个屏幕上有两个按钮(播放和如何播放)。第二个做我想要的,但我希望第一个在发布时开始游戏,并将屏幕更改为第二个屏幕(这工作正常)。 我尝试了很多东西,但总是收到关于 SnakeWidget 未定义、未包含 self 等错误。

这是我得到的错误:

 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' is not defined

.py 文件:

import kivy
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.vector import Vector
from kivy.clock import Clock
from 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()

和.kv文件:

#: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 to 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 to 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

如果可以,请帮助我,因为我被卡住了,无处可去。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    我认为您错过了一些 Python 基础知识。我会以点的形式解释。

    1。您忘记导入您在 python 代码中使用的属性。

    from kivy.properties import NumericProperty,ReferenceListProperty,ObjectProperty
    

    2。你需要知道python解释器是如何工作的,它从上到下读取你的代码,这里GameScreen类是在定义SnakeWidget类之前定义的,所以当你尝试制作@的对象时987654325@ 解释器不存在的类。它显示一个错误。 NameError: name 'SnakeWidget' is not defined。所以基本上,将你的班级 GameScreen 移到班级 SnakeWidget 之下,这样就可以解决错误。

    3。当您尝试安排您的功能时,您使用了selfClock.schedule_interval(self.update, 1.0 / 60.0)

    使用self 会说在同一个类本身中有一个名为update 的方法,而不是在SnakeWidget 类中查找。

    class GameScreen(Screen):
        snaky_game = SnakeWidget()
        snaky_game.begin()
        Clock.schedule_interval(snaky_game.update, 1.0 / 60.0)
    

    【讨论】:

    • 我的实际文件中确实有这些导入,但昨天你删除了我的代码中不需要的所有导入,现在我错误地删除了一些我确实需要的导入,对此感到抱歉。感谢您的上课顺序,我完全忘记了这很重要!不幸的是,它仍然给我一个错误,但是一个不同的错误。它说 NoneType 对象没有属性中心。
    • 我知道那个错误,但是很抱歉,我不能为你制作整个代码,当你几天前问一个类似的问题时,我给了你一个链接。我认为是时候仔细阅读它并掌握您在该答案中看到的每个概念和技巧并相信我,它将消除您的所有疑虑。这是链接stackoverflow.com/questions/30943024/…
    • 我知道,对不起。我确实经历了两次并改变了很多东西,但因为它不起作用而放弃了它。我会再试一次,抱歉问了这么多,谢谢你回答我所有的帖子!
    • 我很乐意提供帮助。 :) 在您厌倦了尝试并且仍然有疑问或被卡住之后,请不要犹豫再问另一个问题,毕竟这就是这个网站的目的,对吧? :D 您的问题将来可能会对某人有所帮助。啊。而且,在您解决问题后,将这些答案标记为已接受。 :)
    • @Uros1234,如果您希望人们继续回答您的问题,您应该将答案标记为已接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多