6 jun
2017

Manejando el valor de una variable entre varias funciones en proyecto de Kivy

Sea el siguiente layout de mi app: introducir la descripción de la imagen aquí Estoy buscando que cuando se pulse el botón "Pregunta acertada", la variable score = 10 y cuando se pulse el botón "Pregunta fallada", la variable score = -5 Para ambos casos, además el label morado muestra el valor de la variable score. Actualmente tengo el siguiente error:

File "design.kv", line 54, in on_release: root.showscore(score) NameError: name 'score' is not defined

Más abajo doy una posible solución aunque no me funciona.

Mi código en python:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

Builder.load_file('design.kv')

class MyWidget(BoxLayout):


    def __init__(self):
        super(MyWidget, self).__init__()

    def showquestion(self):
        with open("question.txt","r") as f:
            filetext = f.read()
            self.ids['label1'].text = filetext

    def showanswer(self):
        with open("answer.txt","r") as f:
            filetext = f.read()
            self.ids['label2'].text = filetext

    def goodanswer(self):
        score = 10
        return score 

    def badanswer(self):
        score = -5
        return score

    def showscore(self,score):
        self.ids['label3'].text = str(score)

class myApp(App):
    def build(self):
        return MyWidget()
    def on_pause(self): 
        return True
    def on_resume(self): 
        pass


if __name__ in ('__main__', '__android__'): 
    myApp().run()

Mi código en .kv:

<MyWidget>:
    size: root.size
    orientation: 'vertical'
    padding: 20
    spacing: 0

    #label1 muestra la pregunta
    Label:
        id: label1
        color: 1,0,1,1
        canvas.before:
            Color:
                rgba: 191/255.0, 144/255.0, 63/255.0, 1
            Rectangle:
                size: self.size
                pos: self.pos

    #label2 muestra la respuesta
    Label:
        id: label2
        color: 1,0,1,1
        canvas.before:
            Color:
                rgba:  110/255.0, 191/255.0, 63/255.0, 1
            Rectangle:
                pos:self.pos
                size: self.size

    Label:
        id: label3
        color: 1,0,1,1
        canvas.before:
            Color:
                rgba: 74/255.0, 25/255.0, 44/255.0, 1
            Rectangle:
                pos:self.pos
                size: self.size


    BoxLayout:
        padding: 0,10,0,0
        spacing: 10
        size_hint:1, 0.25
        orientation: 'horizontal'
        Button:
            id: button1
            text: "Mostrar respuesta"
            on_release: root.showanswer()
        Button:
            id: button2
            text: "Pregunta Acertada"
            on_release: root.goodanswer()
            on_release: root.score
            on_release: root.showscore(score)
        Button:
            id: button3
            text: "Pregunta Fallada"
            on_release: root.badanswer()
            on_release: root.score
            on_release: root.showscore(score)
        Button:
            id: button4
            text: "Mostrar pregunta"
            on_release: root.showquestion()

Una opción que se me ocurre es la siguiente, usando la expresión #:set name value ver doc. :

        Button:
            id: button2
            text: "Pregunta Acertada"
            on_release: 
                #:set score 10
            on_release: root.showscore(score)
        Button:
            id: button3
            text: "Pregunta Fallada"
            on_release:
                #:set score -5
            on_release: root.showscore(score)

El problema es que parece que se hace de una forma global, prevaleciendo el último valor que se le ha dado, en este caso, -5. Quizás explore la vía de resolver este problema por el fichero .kv en vez de hacerlo por el .py, pero eso lo dejo para una pregunta posterior.

COMENTARIOS

DEJA TU COMENTARIO

© 2017 website by Rubit Corporation