2016-01-10 2 views
0

Краткая версия: Как изменить текст кнопки, отображаемый на экране из файла main.py приложения Kivy?Kivy: обновление отображаемого текста кнопки из кода Python

Более длинная версия: Я использую игру с несколькими вариантами с использованием Kivy.

У меня есть игровой процесс, так как я хочу, чтобы он находился на уровне питона: когда пользователь нажимает на правильную кнопку ответа, они получают очки, а ответы, прикрепленные к кнопкам, изменяются. Под капотом все кажется прекрасным.

Моя проблема заключается в том, что я не могу решить, как обновить текст на кнопках, отображаемых на экране, из файла main.py. Игра играет отлично, но текст, отображаемый на кнопках, никогда не изменяется. Как мне исправить мой код?

Ниже представлена ​​упрощенная версия того, что я Тринг делать:

Мой main.py файл:

# -*- coding: utf-8 -*- 

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition 
from kivy.properties import ObjectProperty 
from functools import partial 

import random 


vocabDict = {'latte': 'milk', 'mela': 'apple', 'melograno': 'pomegranate', 'fragola': 'strawberry', 'acqua': 'water'} 

vocabList = ['acqua', 'latte', 'mela', 'melograno', 'fragola'] 

currentWord = 'acqua' 

score = 0 

class ScreenOne(Screen): 
    pass 

class ScreenTwo(Screen): 

    def __init__(self,**kwargs): 
     super(ScreenTwo, self).__init__(**kwargs) 
     Screen.currentWord = self.getCurrentWord() 
     Screen.questionText = Screen.currentWord 
     Screen.vocabDict = self.getVocabDict() 
     Screen.currentScore = self.getCurrentScore() 
     Screen.possibleAnswerList = [Screen.currentWord] 
     self.playHand(Screen.currentWord,Screen.vocabDict,Screen.currentScore) 

    def getCurrentWord(self): 
     return currentWord 

    def getVocabDict(self): 
     return vocabDict 

    def getCurrentScore(self): 
     return score 

    def playHand(self,currentWord,vocabDict,score): 
     possibleAnswerList = [currentWord] 
     currentWord = currentWord 
     vocabDict = vocabDict 
     currentScore = score 
     while len(possibleAnswerList) < 3: 
      potentialChoice = random.choice(vocabDict.keys()) 
      if potentialChoice not in possibleAnswerList: 
       possibleAnswerList.append(potentialChoice) 
     random.shuffle(possibleAnswerList)   

     # How do I visualize these changes on screen? 
     Screen.button1Text = vocabDict[possibleAnswerList[0]] 
     Screen.button2Text = vocabDict[possibleAnswerList[1]] 
     Screen.button3Text = vocabDict[possibleAnswerList[2]] 

     Screen.possibleAnswerList = possibleAnswerList 

     print "Screen.button1Text = " + Screen.button1Text 
     print "Screen.button2Text = " + Screen.button2Text 
     print "Screen.button3Text = " + Screen.button3Text 

    def button1Pressed(instance): 
     print "Screen.possibleAnswerList[0] = " + Screen.possibleAnswerList[0] 
     print "Screen.currentWord = " + Screen.currentWord 
     if Screen.possibleAnswerList[0] == Screen.currentWord: 
      print "Correct!" 
      Screen.currentScore += 1 
      print Screen.currentScore 
      instance.playHand(Screen.currentWord,Screen.vocabDict,Screen.currentScore) 
     else: 
      print "Incorrect!" 

    def button2Pressed(instance): 
     if Screen.possibleAnswerList[1] == Screen.currentWord: 
      print "Correct!" 
      Screen.currentScore += 1 
      print instance.currentScore 
      instance.playHand(Screen.currentWord,Screen.vocabDict,Screen.currentScore) 
     else: 
      print "Incorrect!" 

    def button3Pressed(instance): 
     if instance.possibleAnswerList[2] == currentWord: 
      print "Correct!" 
      instance.currentScore += 1 
      print instance.currentScore 
      instance.playHand(Screen.currentWord,Screen.vocabDict,Screen.currentScore) 
     else: 
      print "Incorrect!" 

class Manager(ScreenManager): 

    screen_one = ObjectProperty(None) 
    screen_two = ObjectProperty(None) 

class ScreensApp(App): 

    def build(self): 
     m = Manager(transition=NoTransition()) 
     return m 

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

Мой screens.kv файл:

#:kivy 1.8.0 

<ScreenOne>: 

    BoxLayout: 
     orientation: "vertical" 
     size: root.size 
     spacing: 20 
     padding: 20 

     Label: 
      text: "Main Menu" 
     Button: 
      text: "Button 1" 
      on_release: root.manager.current = "screen2" 

<ScreenTwo>:   

    BoxLayout: 
     orientation: "vertical" 
     size: root.size 
     spacing: 20 
     padding: 20 

     Label: 
      id: label 
      text: root.questionText 
     Button: 
      id: button1 
      text: root.button1Text 
      on_release: root.button1Pressed()   
     Button: 
      id: button2 
      text: root.button2Text 
      on_release: root.button2Pressed()    
     Button: 
      id: button3 
      text: root.button3Text 
      on_release: root.button3Pressed()   

<Manager>: 
    id: screen_manager 

    screen_one: screen_one 
    screen_two: screen_two 

    ScreenOne: 
     id: screen_one 
     name: "screen1" 
     manager: screen_manager 

    ScreenTwo: 
     id: screen_two 
     name: "screen2" 
     manager: screen_manager 

Как должно быть совершенно очевидно, Я новичок в Kivy, поэтому я был бы очень признателен, если бы вы могли показать мне, что мне нужно изменить, включая конкретный синтаксис, который следует использовать.

Заранее благодарим за ваше время и мудрость.

ответ

1

Вам нужно сделать BUTTON1/2/3Text в StringProperty, такие как

from kivy.properties import StringProperty # <---- (: 

class ScreenTwo(Screen): 
    button1Text = StringProperty ('some text') 
    button2Text = StringProperty ('some text2') 
    button3Text = StringProperty ('some text3') 



    def __init__(...): 
     ... 

    #notice that Screen was replaced by "self" 

    # How do I visualize these changes on screen? 
    self.button1Text = vocabDict[possibleAnswerList[0]] 
    self.button2Text = vocabDict[possibleAnswerList[1]] 
    self.button3Text = vocabDict[possibleAnswerList[2]] 

Просьба также заменить экран с себя во всех других местах, а так как вы помещаете переменные в классе kivy и его странно;)

Я надеюсь, что это вам поможет

+0

Большое спасибо йоаз. Теперь вы заменили «Экран» на «я», как вы предположили. Боюсь, я не совсем понимаю, что вы подразумеваете, добавив 'button1Text = StringProperty ('some text')' хотя. Когда я добавляю его дословно, как вы указали в примере, все, что я получаю, это сообщение об ошибке, указывающее, что 'NameError: name 'StringProperty' не определен'. Любой шанс, что вы можете сделать мне большую услугу и сообщить мне, что мне нужно делать здесь? –

+0

@ R.Duke Я отредактировал мое сообщение (добавил импорт), найдите время, чтобы исправить свой код, вы почти там :) –

+0

Awesome. Исправлена. Огромное спасибо. –

Смежные вопросы