Как отобразить переменную в файле kv

#python #kivy

Вопрос:

Вот файл py

 import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.popup import Popup
from kivy.uix.screenmanager import Screen
from kivy.properties import ListProperty
from kivy.lang import Builder
from kivy.properties import BooleanProperty, NumericProperty
from kivy.uix.togglebutton import ToggleButton
import string
import random


class MyGrid(Widget):
    name = ObjectProperty(None)
    email = ObjectProperty(None)
    bmi = NumericProperty(0)

    def btn(self):
        height = float(self.name.text)
        weight = float(self.email.text)
        bmi = weight/(height*height)
        
        print("Name:", self.name.text, "email:", self.email.text, "bmi:", str(bmi))
        self.name.text = ""
        self.email.text = ""
        show_popup()

class P(FloatLayout):
    pass

class MyApp(App):
    def build(self):
        return MyGrid()

def show_popup():
    show = P()

    popupWindow = Popup(title="BMI", content=show, size_hint=(None,None),size=(400,400))

    popupWindow.open()

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

Вот файл kv

 <MyGrid>:

    name: name
    email: email

    GridLayout:
        cols:1
        size: root.width - 200, root.height -200
        pos: 100, 100

        GridLayout:
            cols:2

            Label:
                text: "Height: "

            TextInput:
                id: name
                multiline:False

            Label:
                text: "Weight: "

            TextInput:
                id: email
                multiline:False

        Button:
            text:"Submit"
            on_release: root.btn()

<P>:
    Label:
        text: "Your BMI is: "
        size_hint: 0.6, 0.2
        pos_hint: {"x":0.2, "top":1}
 

Как вы отображаете значение переменной » ИМТ » в метке. Я хочу, чтобы во всплывающем сообщении отображался следующий текст: «Ваш ИМТ:» ИМТ, но когда я это делаю, это выдает ошибку. Как вы отображаете переменную в файле kv. Это очень простой вопрос, но я, кажется, нигде не могу найти ответа. Вы просто говорите текст: «Ваш ИМТ:» root.bmi, потому что я пробовал это, но это не сработало.

Ответ №1:

Один из способов сделать это-просто передать индекс массы тела в show() метод. Вот модифицированный show() метод, который делает это:

 def show_popup(bmi):
    show = P()

    popupWindow = Popup(title="BMI", content=show, size_hint=(None, None), size=(400, 400))
    show.ids.bmi.text = "Your BMI is: "   str(bmi)

    popupWindow.open()
 

Вышесказанное требует наличия id в kv :

 <P>:
    Label:
        id: bmi
        text: "Your BMI is: "
        size_hint: 0.6, 0.2
        pos_hint: {"x":0.2, "top":1}
 

И небольшое изменение btn() метода для передачи значения ИМТ:

 def btn(self):
    height = float(self.name.text)
    weight = float(self.email.text)
    bmi = weight / (height * height)

    print("Name:", self.name.text, "email:", self.email.text, "bmi:", str(bmi))
    self.name.text = ""
    self.email.text = ""
    show_popup(bmi)