Python kv файл, как вызвать функцию из другого класса - PullRequest
0 голосов
/ 19 марта 2019

Как я могу вызвать метод из класса Account в моем файле kv?

py файл:

import kivy
kivy.require("1.10.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
class Account():
def __init__(self,name, balance):
    self.name = name
    self.__balance__ = balance
def getBalance(self):
    return (self.__balance__)
def setBalance(self, zmena):
    self.__balance__ = self.__balance__+zmena
acc = Account("Account1", "1000")
class myWidget(Widget):
Builder.load_file("MP.kv")
class MainApp(App):
def build(self):
    return myWidget()
if __name__ == "__main__":
MainApp().run()

файл кв:

#:kivy 1.10.1

<Button>
background_color: 0.1, 0.1, 0.9, 0.9
font_size: 22
<Label>
background_color: 0.1, 0.1, 0.9, 0.9
font_size: 22

<myWidget>:
Label:
    id: lb
    text: "Account"
    pos: root.width /2-self.width/2, root.top/2+200
Label:
    id: lb1
    text: "Account name"
    pos: root.width /2-self.width/2, root.top/2+150
Label:
    id: lb2
    text: "balance"   '''here i want call methot getBalance, but how?
    pos: root.width /2-self.width/2, root.top/2+100
Label:
    id: lb3
    text: "Add/sub money"
    pos: root.width /2-self.width/2, root.top/2+50
TextInput:
    id: tp
    text: "money"
    pos: root.width /2-self.width/2, root.top/2-50
    size_hint: .5, .25
Button:
    id: btn1
    text: "Confirm"
    size_hint: .5, .25
    pos: root.width /2-self.width/2, root.top/2-150

1 Ответ

0 голосов
/ 19 марта 2019

Вопрос № 2

если я добавлю немного денег, как мне обновить баланс в Label lb2?

Решение № 2

Используйте Kivy Properties, например. StringProperty, потому что они генерируют события, так что при изменении атрибута вашего объекта все свойства, которые ссылаются на этот атрибут, автоматически обновляются.

Пример # 2

main.py

import kivy

kivy.require("1.10.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, StringProperty


class Account():
    def __init__(self, name, balance):
        self.name = name
        self.__balance__ = balance

    def getBalance(self):
        return (self.__balance__)

    def setBalance(self, zmena):
        self.__balance__ = self.__balance__ + zmena


class myWidget(Widget):
    acc = ObjectProperty(None)
    balance = StringProperty('')

    def __init__(self, **kwargs):
        super(myWidget, self).__init__(**kwargs)
        self.acc = Account("Account1", 1008)
        self.update_balance()

    def update_balance(self):
        self.balance = str(self.acc.getBalance())


Builder.load_file("MP.kv")


class MainApp(App):
    def build(self):
        return myWidget()


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

MP.kv

#:kivy 1.10.1

<Button>:
    background_color: 0.1, 0.1, 0.9, 0.9
    font_size: 22

<Label>:
    background_color: 0.1, 0.1, 0.9, 0.9
    font_size: 22

<myWidget>:
    Label:
        id: lb
        text: "Account"
        pos: root.width /2-self.width/2, root.top/2+200
    Label:
        id: lb1
        text: "Account name"
        pos: root.width /2-self.width/2, root.top/2+150
    Label:
        id: lb2
        text: root.balance
        pos: root.width /2-self.width/2, root.top/2+100
    Label:
        id: lb3
        text: "Add/sub money"
        pos: root.width /2-self.width/2, root.top/2+50
    TextInput:
        id: tp
        hint_text: "money"
        pos: root.width /2-self.width/2, root.top/2-50
        size_hint: .5, .25
    Button:
        id: btn1
        text: "Confirm"
        size_hint: .5, .25
        pos: root.width /2-self.width/2, root.top/2-150
        on_release:
            root.acc.setBalance(int(tp.text))
            root.update_balance()

Выход № 2

lb2 automatically updated when balance is updated

Решение

Python Script - main.py

  1. Добавить оператор импорта для Kivy ObjectProperty, например. from kivy.properties import ObjectProperty
  2. Объявите объектный объект Kivy, например, acc = ObjectProperty(None)
  3. Реализовать метод конструктора для myWidget ()

файл кв

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

text: '' if root.acc is None else root.acc.getBalance()
* * Пример тысячи сорок четыре * * 1045

main.py

import kivy

kivy.require("1.10.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty


class Account():
    def __init__(self, name, balance):
        self.name = name
        self.__balance__ = balance

    def getBalance(self):
        return (self.__balance__)

    def setBalance(self, zmena):
        self.__balance__ = self.__balance__ + zmena


class myWidget(Widget):
    acc = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(myWidget, self).__init__(**kwargs)
        self.acc = Account("Account1", "1000")


Builder.load_file("MP.kv")


class MainApp(App):
    def build(self):
        return myWidget()


if __name__ == "__main__":
    MainApp().run()
* * MP.kv тысяча сорок-девять
#:kivy 1.10.1

<Button>:
    background_color: 0.1, 0.1, 0.9, 0.9
    font_size: 22

<Label>:
    background_color: 0.1, 0.1, 0.9, 0.9
    font_size: 22

<myWidget>:
    Label:
        id: lb
        text: "Account"
        pos: root.width /2-self.width/2, root.top/2+200
    Label:
        id: lb1
        text: "Account name"
        pos: root.width /2-self.width/2, root.top/2+150
    Label:
        id: lb2
        text: '' if root.acc is None else root.acc.getBalance()
        pos: root.width /2-self.width/2, root.top/2+100
    Label:
        id: lb3
        text: "Add/sub money"
        pos: root.width /2-self.width/2, root.top/2+50
    TextInput:
        id: tp
        text: "money"
        pos: root.width /2-self.width/2, root.top/2-50
        size_hint: .5, .25
    Button:
        id: btn1
        text: "Confirm"
        size_hint: .5, .25
        pos: root.width /2-self.width/2, root.top/2-150

выход

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...