2016-07-25 89 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()