Python Kv File How To Call Function From Another Class
How can I call a method from class Account in my kv file? py file: import kivy kivy.require('1.10.1') from kivy.app import App from kivy.lang import Builder from kivy.uix.widget im
Solution 1:
Question #2
if i add some money, how i update balance in Label lb2?
Solution #2
Use Kivy Properties e.g. StringProperty, because they produce events such that when an attribute of your object changes, all properties that reference that attribute are automatically updated.
Example #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()
Output #2
Solution
Python Script - main.py
- Add import statement for Kivy ObjectProperty e.g.
from kivy.properties import ObjectProperty
- Declare a Kivy ObjectProperty, e.g.
acc = ObjectProperty(None)
- Implement constructor method for myWidget()
kv file
When the app start, acc is None. Therefore, we need to check for None to avoid error.
text: '' if root.acc is None else root.acc.getBalance()
Example
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
Post a Comment for "Python Kv File How To Call Function From Another Class"