2016-07-25 88 views
1

前几天(昨天实际上:D)我开始在KIVY(这是一个python模块 - 如果我可以称之为)编程。KIVY - Python继续按下按钮

我对python本身非常熟悉,但是在某些解决方案中,我发现KIVY相当普遍且很难。

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

我试过多种解决方案,例如我用蟒蛇时间模块:

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 

谢谢您的时间和帮助。 GryTrean

//我把“我”改成了“self.i”,但没有解决问题。

回答

0

Here是kivy中的按钮API。适用于您的问题的两个绑定是on_presson_release绑定。你可以用Button.bind()方法来使用它们。将函数绑定到按钮绑定的示例可用here

+0

我知道,但我想保留将值添加到root.posx直到释放按钮。我怎么做?感谢您的帮助/尝试帮助:) – GryTrean

+0

您尚未发布显示您如何附加到按钮绑定的代码,这就是我提到按钮API的原因。请发布显示您的按钮绑定的代码。 – TypeKazt

+0

我不使用绑定。这些按钮是在.kv文件中创建的,这也是代码存在的原因(查看第二个按钮,将图像留下== self.posx-1)。我想继续添加/删除此值,直到客户端停止按住按钮。我正在做一个移动平台游戏,我不知道你是否知道我的意思,但在最平常的游戏中,你有一个按钮,而当你按下它(握住它)时,你继续朝着一个方向前进(例如对)。我希望你知道我的意思:D – GryTrean

1

我创建了一个简单的例子给你,拥有如何将一个字符(在这种情况下,精灵战士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' 


<[email protected]>: 
    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()