android - KIVY - Python 在按下按钮时继续执行

标签 android python ios kivy

我目前正在尝试为 IOS/Android 制作一款平台游戏,但我遇到了一个问题。我创建了两个按钮和一个角色。我希望角色在释放按钮之前一直移动。我的意思是:我可以在按下按钮时移动角色一次,但我希望它一直移动直到释放按钮。

我尝试了多种解决方案,例如我使用了 pythons 时间模块:

class Level1(Screen):
    posx = NumericProperty(0)
    posy = NumericProperty(0)
    moving = True
    i = 0
    def __init__(self, **kwargs):
        super(Level1, self).__init__(**kwargs)

    def rightmove(self):
        self.posx = self.posx+1
        time.sleep(10)

    def goright(self):
        while self.moving == True:
            self.rightmove()
            i += 1
            if i == 10:
                break


    def stopright(self):
        self.moving == False

但它不起作用。 它认为它以某种方式陷入了无限循环,因为当我按下按钮时,应用程序停止工作(“应用程序停止工作...”错误)。

我几乎不知道该如何解决这个问题。最近几个小时我一直在尝试,但还没有找到解决方案。 这是我的 .py 文件:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition,         SlideTransition
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, NumericProperty
from kivy.clock import Clock
from kivy.uix.floatlayout import FloatLayout
import time
Config.set('graphics','resizable',0) #don't make the app re-sizeable
#Graphics fix
 #this fixes drawing issues on some phones
Window.clearcolor = (0,0,0,1.) 

language = "english"
curr1msg = 1

class HomeScreen(Screen):
    pass  

class OptionsScreen(Screen):
    pass

class GameScreen(Screen):
    pass

class LevelScreen(Screen):
    pass

class Level1intro(Screen):
    global language
    global curr1msg
    if language == "english" and curr1msg == 1:
        pName = "Pedro"
        msg1 = """Hello my friend!
My name is Pedro and I have a problem. Will you help me?
My spanish studens have a spanish test tomorrow, but I lost the exams!
You are the only one who can help me!"""
        cont = "Press anywhere to continue..."
    elif language == "swedish" and curr1msg == 1:
        pName = "Pedro"
        msg1 = """Hejsan!
Jag är Pedro och jag har ett problem. Kan du hjälpa mig?
Mina spanska-elever har ett spanskaprov imorgon men jag har tappat bort     proven!
Du är den enda som kan hjälpa mig!"""
        cont = "Tryck på skärmen för att fortsätta..."

class Level1(Screen):
        posx = NumericProperty(0)
        posy = NumericProperty(0)
        moving = True
        i = 0
        def __init__(self, **kwargs):
            super(Level1, self).__init__(**kwargs)

        def rightmove(self):
            self.posx = self.posx+1
            time.sleep(10)

        def goright(self):
            while self.moving == True:
                self.rightmove()
                i += 1
                if i == 10:
                    break


        def stopright(self):
            self.moving == False


class ScreenManagement(ScreenManager):
    pass


presentation = Builder.load_file("main.kv")

class MainApp(App):
    def build(self):
        return presentation

if __name__ == "__main__":
    MainApp().run()

这是我的 .kv 文件:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import SlideTransition kivy.uix.screenmanager.SlideTransition
ScreenManagement:
    transition: FadeTransition()
    HomeScreen:
    OptionsScreen:
    LevelScreen:
    Level1intro:
    Level1:

<HomeScreen>:
    name: 'home'

    FloatLayout:
        canvas:
            Rectangle:
                source:"images/home_background.jpg"
                size: self.size
        Image:
            source:"images/logo.png"
            allow_stretch: False
            keep_ratio: False
            opacity: 1.0
            size_hint: 0.7, 0.8
            pos_hint: {'center_x': 0.5, 'center_y': 0.9}
        Button:
            size_hint: 0.32,0.32
            pos_hint: {"x":0.34, "y":0.4}
            on_press:
                app.root.transition = SlideTransition(direction="left")
                app.root.current = "level"
            background_normal: "images/play_button.png"
            allow_stretch: False
        Button:
            size_hint: 0.25,0.25
            pos_hint: {"x":0.38, "y":0.15}
            on_press:
                app.root.transition = SlideTransition(direction="left")
                app.root.current = 'options'
            background_normal: "images/settings_button.png"

<OptionsScreen>:
    name: 'options'

<LevelScreen>
    name: "level"

    FloatLayout:
        canvas:
            Rectangle:
                source:"images/home_background.jpg"
                size: self.size
        Label:
            text: "[b]Choose Level[/b]"
            markup: 1
            font_size: 40
            color: 1,0.5,0,1
            pos: 0,250
        Button:
            size_hint: 0.1,0.1
            pos_hint: {"x": 0.1, "y": 0.8}
            on_press:
                app.root.current = "level1intro"
            Image:
                source:"images/level1.png"
                allow_stretch: True
                y: self.parent.y + self.parent.height - 70
                x: self.parent.x
                height: 80
                width: 80

        Button:
            background_normal: "images/menu_button.png"
            pos_hint: {"x": 0.4, "y": 0}
            size_hint: 0.3,0.3
            pos_hint: {"x": 0.35}
            on_press:
                app.root.transition = SlideTransition(direction="right")
                app.root.current = "home"

<Level1intro>
    name: "level1intro"

    canvas:
        Rectangle:
            source: "images/background.png"
            size: self.size
    Image:
        source: "images/dialog.png"
        pos_hint: {"y": -0.35}
        size_hint: 0.7,1.0
    Label:
        font_size: 20
        color: 1,1,1,1
        pos_hint: {"x": -0.385, "y": -0.285}
        text: root.pName
    Label:
        font_size: 15
        color: 1,1,1,1
        pos_hint: {"x": -0.15, "y": -0.4}
        text: root.msg1
    Label:
        font_size: 15
        color: 0.7,0.8,1,1
        pos_hint: {"x": 0.025, "y": -0.449}
        text: root.cont
        on_touch_down: 
            app.root.transition = FadeTransition()
            app.root.current = "level1"

<Level1>
    name: "level1"
    canvas:
        Rectangle:
            source: "images/background.png"
            size: self.size

    Button:
        text: ">"
        size_hint: 0.1,0.1
        pos_hint: {"x":0.9, "y":0.0}
        on_press:
            root.goright()
        on_release:
            root.stopright()
    Button:
        text: "<"
        size_hint: 0.1,0.1
        pos_hint: {"x": 0.0, "y": 0.0}
        on_press:
            root.posx = root.posx-1

    Image:
        id: char
        source: "images/idle1.png"
        size: self.size
        pos: root.posx,root.posy

感谢您的宝贵时间和帮助。 Gerrit 兰

//我将“i”更改为“self.i”,但并没有解决问题。

最佳答案

我为您创建了一个简单的示例,展示了如何通过按下按钮移动角色(在本例中为 elf warrior level 1):

#!/usr/bin/env python3.5
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import mainthread, Clock

gui = '''
Root:
    orientation: 'vertical'

    arena: arena
    control_button: control_button

    Arena:
        id: arena

    Button
        id: control_button
        size_hint_y: None
        height: dp(50)
        text: 'move'


<Arena@FloatLayout>:
    player: player

    Button:
        id: player
        pos: 150, 300
        text: 'elf warrior\\nlevel 1'
        size_hint: None, None
        size: 100, 100
'''


class Root(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        @mainthread
        def job():
            self.control_button.bind(on_press=self._on_press)
            self.control_button.bind(on_release=self._on_release)

        job()

    def _on_press(self, button):
        self.arena.start_movement()

    def _on_release(self, button):
        self.arena.stop_movement()


class Arena(FloatLayout):

    def start_movement(self):
        Clock.schedule_interval(self._move_right, 0.01)

    def stop_movement(self):
        Clock.unschedule(self._move_right)

    def _move_right(self, dt):
        self.player.x += 1


class Test(App):

    def build(self):
        return Builder.load_string(gui)


Test().run()

关于android - KIVY - Python 在按下按钮时继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38578280/

相关文章:

python - 如何在Python中找到真阳性、真阴性、假阳性、假阴性

python - OSError : out of pty devices 故障排除

ios - 在 CoreData 中使用来自服务器的排序顺序并提供给 NSFetchedResultsController 而没有属性进行排序

android - DAO:如何使用 Insert 的返回值

java - Android SDK( eclipse ): How To Use SetOnKeyListener with Button?

android - 服务器无法处理请求。连接未关闭

iphone - UITableViewCell 分配问题 - 单元格不为零

Android - 打开软键盘时 html 输入失去焦点 (ASP.net)

python - 对于 Keras LSTM,传递滞后特征与特征时间步长有什么区别?

ios - 这是在说什么布局约束?