2016-07-25 5 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

// Я изменил «i» на «self.i», и это не устраняет проблему.

ответ

0

Here - кнопка API в kivy. Двумя связями, которые применимы к вашей проблеме, являются привязки on_press и on_release. Вы использовали бы их с методом Button.bind(). Пример привязки функции к привязке кнопок доступен here.

+0

Я знаю, но я хочу, чтобы сохранить добавляя значение к root.posx до тех пор, пока кнопка не будет отпущена. Как мне это сделать? Спасибо за вашу помощь/попробуйте помочь :) – GryTrean

+0

Вы не разместили свой код, который показывает, как вы прикрепляетесь к привязкам кнопок, поэтому я упомянул кнопку API. Отправьте свой код, который показывает привязки кнопок. – TypeKazt

+0

Im не использует привязку. Кнопки создаются в файле .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()