Kivy is a free, open source Python library that allows for quick and easy development of highly interactive multi platform applications.
Kivy’s execution speed is comparable to the native mobile alternative, Java for Android or Objective C for iOS.
Moreover, Kivy has the huge advantage of being able to run on multiple platforms, just as HTML does; in which case, Kivy performs better because it doesn’t rely on a heavy browser, and many of its components are implemented in C using the Cython library in such a way that most of the graphics processing runs directly in the GPU.
In this tutorial we will create a Accounting Vouchers application using Python and the Kivy language. If you are new here then I will recommend you to first see my tutorial on creating a Clock application with python kivy.
Creating an Accounting Vouchers application
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
import re
class OperatorWindow(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.cart = []
self.qty = []
self.total = 0.00
def update_purchases(self):
pcode = self.ids.code_inp.text
products_container = self.ids.products
if pcode == '1234' or pcode == '2345':
details = BoxLayout(size_hint_y=None,height=30,pos_hint={'top': 1})
products_container.add_widget(details)
code = Label(text=pcode,size_hint_x=.2,color=(.06,.45,.45,1))
name = Label(text='python',size_hint_x=.3,color=(.06,.45,.45,1))
qty = Label(text='1',size_hint_x=.1,color=(.06,.45,.45,1))
disc = Label(text='0.00',size_hint_x=.1,color=(.06,.45,.45,1))
price = Label(text='0.00',size_hint_x=.1,color=(.06,.45,.45,1))
total = Label(text='0.00',size_hint_x=.2,color=(.06,.45,.45,1))
details.add_widget(code)
details.add_widget(name)
details.add_widget(qty)
details.add_widget(disc)
details.add_widget(price)
details.add_widget(total)
#Update Preview
pname = "Product One"
if pcode == '2345':
pname = "Product Two"
pprice = 1.00
pqty = str(1)
self.total += pprice
purchase_total = '`\n\nTotal\t\t\t\t\t\t\t\t'+str(self.total)
self.ids.cur_product.text = pname
self.ids.cur_price.text = str(pprice)
preview = self.ids.receipt_preview
prev_text = preview.text
_prev = prev_text.find('`')
if _prev > 0:
prev_text = prev_text[:_prev]
ptarget = -1
for i,c in enumerate(self.cart):
if c == pcode:
ptarget = i
if ptarget >= 0:
pqty = self.qty[ptarget]+1
self.qty[ptarget] = pqty
expr = '%s\t\tx\d\t'%(pname)
rexpr = pname+'\t\tx'+str(pqty)+'\t'
nu_text = re.sub(expr,rexpr,prev_text)
preview.text = nu_text + purchase_total
else:
self.cart.append(pcode)
self.qty.append(1)
nu_preview = '\n'.join([prev_text,pname+'\t\tx'+pqty+'\t\t'+str(pprice),purchase_total])
preview.text = nu_preview
class OperatorApp(App):
def build(self):
return OperatorWindow()
if __name__=="__main__":
oa = OperatorApp()
oa.run()<FlatButton@ButtonBehavior+Label>:
font_size: 14
<OperatorWindow>:
id: main_win
orientation: 'vertical'
canvas.before:
Color:
rgba: (1,1,1, 1)
Rectangle:
size: self.size
pos: self.pos
BoxLayout:
id: header
size_hint_y: None
height: 40
canvas.before:
Color:
rgba: (.90, .20, .20, .90)
Rectangle:
size: self.size
pos: self.pos
Label:
text: 'Accounting Vouchers'
size_hint_x: .9
bold: True
color: (1,1,1,1)
FlatButton:
id: loggedin_user
text: 'thecleverprogrammer'
color: (1,1,1,1)
BoxLayout:
id: current
size_hint_y: None
height: 50
canvas.before:
Color:
rgba: (1,1,1, 1)
Rectangle:
size: self.size
pos: self.pos
Button:
text: 'Current Item:'
background_normal: ''
background_color: (.90, .20, .20, .90)
size_hint_x: .4
Button:
id: cur_product
text: 'Default Product'
background_normal: ''
background_color: (.90, .20, .20, .90)
Button:
id: cur_price
text: '0.00'
background_normal: ''
background_color: (.90, .20, .20, .90)
size_hint_x: .2
BoxLayout:
padding: 10
BoxLayout:
id: product_details
orientation: "vertical"
size_hint_x: .8
spacing: 10
BoxLayout:
id: product_labels
size_hint_y: None
height: 40
canvas.before:
Color:
rgba: (.90,.20,.20, .90)
Rectangle:
size: self.size
pos: self.pos
FlatButton:
text: 'Quantity'
size_hint_x: .1
FlatButton:
text: 'Product Code'
size_hint_x: .3
FlatButton:
text: 'Discount'
size_hint_x: .1
FlatButton:
text: 'Disc %'
size_hint_x: .1
FlatButton:
text: 'VAT'
size_hint_x: .1
FlatButton:
text: 'Price'
size_hint_x: .1
FlatButton:
text: 'Product Total'
size_hint_x: .2
BoxLayout:
id: product_inputs
size_hint_y: None
height: 30
spacing: 5
TextInput:
id: qty_inp
size_hint_x: .1
TextInput:
id: code_inp
size_hint_x: .3
multiline: False
on_text_validate: root.update_purchases()
TextInput:
id: disc_inp
size_hint_x: .1
TextInput:
id: disc_perc_inp
size_hint_x: .1
TextInput:
id: vat_inp
size_hint_x: .1
TextInput:
id: price_inp
size_hint_x: .1
TextInput:
id: total_inp
size_hint_x: .2
BoxLayout:
id: add_to_cart
orientation: 'vertical'
BoxLayout:
size_hint_y: None
height: 30
canvas.before:
Color:
rgba: (.90, .20,.20, .90)
Rectangle:
size: self.size
pos: self.pos
Label:
text: 'Code'
size_hint_x: .2
Label:
text: 'Product name'
size_hint_x: .3
Label:
text: 'Qty'
size_hint_x: .1
Label:
text: 'Disc'
size_hint_x: .1
Label:
text: 'Price'
size_hint_x: .1
Label:
text: 'Total'
size_hint_x: .2
GridLayout:
id: products
cols: 1
BoxLayout:
id: preview
orientation: 'vertical'
size_hint_x: .2
TextInput:
id: receipt_preview
readonly: True
text: 'thecleverprogrammer\nKalka ji,\nNew Delhi(110019\nIndia\nTel: 8587992208\nReceipt No: \nDate: \n\n'
BoxLayout:
id: footer
size_hint_y: None
height:30
canvas.before:
Color:
rgba: (.90, .20, .20, .90)
Rectangle:
pos: self.pos
size: self.size
Label:
text: 'Maintained By Aman Kharwal'#Output





