Python Kivy Tutorial – Accounting Vouchers

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

Aman Kharwal
Aman Kharwal

I'm a writer and data scientist on a mission to educate others about the incredible power of data📈.

Articles: 1538

Leave a Reply