Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Python Tkinter: Lahja -tai perintövero

koodaaja [13.07.2021 17:13:41]

#

Tämä ohjelma laskee perintö -ja lahjaveron, jotka ovat molemmat progressiivisia, eli veroprosentti kasvaa, kun siirrytään ylempään tuloluokkaan tai tässä tapauksessa perintö -tai lahjaveroluokkaan. Perintö -ja lahjaverossa on kaksi luokkaa, joka tarkoittaa sitä, että esim. serkku joutuu maksamaan suurempa veroa kun aivan lähisukulaiset. Ohjelma tallentaa ensin taulukkoon tiedot kyseisestä verotyypistä ja luokasta ja laskee sitten perinnön tai lahjan kautta tuloksen.

from tkinter import *


root = Tk()


def Laske():
 global vero, tulos
 arvoAlarajat = []
 veroAlarajat = []
 veroProsentit = []
 arvoAlaraja = 0.0
 veroAlaraja = 0.0
 veroProsentti = 0.0
 arvo = float(e1.get())

 #Lahja -ja perintövero ovat molemmat progressiivisia ja näin ollen
 #Niiden laskua kaava on sama eli veroAlaraja+(tulo-tuloAlaraja)*veroProsentti
 #Katsotaaan, minkä tyyppisen veron käyttäjä on valinnut ja laitetaan tiedot sen mukaan.
 #Perintö -ja lahjaverossaverossa on kaksi luokkaa.

 if (int(vero.get()) == 1):
  #Perintövero luokka I
  arvoAlarajat.extend([20000,40000,60000,200000,1000000])
  veroAlarajat.extend([100,1500,3500,21700,149700])
  veroProsentit.extend([7,10,13,16,19])

 elif (int(vero.get()) == 2):
  #Perintövero luokka II
  arvoAlarajat.extend([20000,40000,60000,200000,1000000])
  veroAlarajat.extend([100,3900,8900,49500,297500])
  veroProsentit.extend([19,25,29,31,33])

 elif (int(vero.get()) == 3):
  #Lahjavero luokka I
  arvoAlarajat.extend([5000,25000,55000,200000,1000000])
  veroAlarajat.extend([100,1700,4700,22100,142100])
  veroProsentit.extend([8,10,12,15,17])

 elif (int(vero.get()) == 4):
  #Lahjavero luokka II
  arvoAlarajat.extend([5000,25000,55000,200000,1000000])
  veroAlarajat.extend([100,3900,11400,53450,301450])
  veroProsentit.extend([19,25,29,31,33])

 #Otetaan lähtötiedot käyttäjän syöttämän tulon mukaan.

 for x in range(len(arvoAlarajat)):
  if (arvo > arvoAlarajat[x]):
   arvoAlaraja = float(arvoAlarajat[x])
   veroAlaraja = float(veroAlarajat[x])
   veroProsentti = veroProsentit[x]/100.0

 #Lasketaan vero.
 summa = veroAlaraja+(arvo-arvoAlaraja)*veroProsentti

 tulos.set(str(summa))
frame = Frame(root)
frame.pack()

#Ensimmäinen frame
#Ensimmäiseen kehykseen laitetaan valinnat.
vero = IntVar()
#Ohjelmassa voi valita kolme erilaista progressiivista veroa.
radio1 = Radiobutton(frame,text="Perintövero I", variable=vero,value=1)
radio1.pack()
radio2 = Radiobutton(frame,text="Perintövero II", variable=vero,value=2)
radio2.pack()
radio3 = Radiobutton(frame,text="Lahjavero", variable=vero,value=3)
radio3.pack()
radio4 = Radiobutton(frame,text="Lahjavero II ", variable=vero,value=4)
radio4.pack()

#Toinen frame
#Toiseen kehykseen laitetaan tekstikenttä ja näppäin.
frame2 = Frame(root)
frame2.pack()
selite = StringVar()
selite.set("Perinnön tai lahjan määrä")
l1 = Label(frame2,textvariable=selite)
l1.pack()
e1 = Entry(frame2,bd=5)
e1.pack()
b1 = Button(frame2,text="Laske",command=Laske)
b1.pack()

#Kolmas frame.
#Kolmanteen kehykseen laitetaan tulos.
frame3 = Frame(root)
frame3.pack()
tulos = StringVar()
tulos.set("Tulos:")
l2 = Label(frame3,textvariable=tulos)
l2.pack()

root.mainloop()

Metabolix [14.07.2021 10:50:44]

#

Hienoa, että koodissa on tällä kertaa jotain järkeä. Tosin tällaisia käytännön laskureita kannattaisi tehdä vaikka HTML-JS-yhdistelmällä ja julkaista koodilaatikon sijaan toimivina nettisivuina vaikka GitHub Pages -palvelun kautta. Sillä tavalla niistä olisi mahdollisesti jotain iloa tai hyötyä, koska tuskin kukaan laskuria kaipaava maallikko alkaa asentaa Pythonia ja ajaa vierasta skriptiä siinä, ja koodin puolesta nämä eivät ole kovin mallikelpoisia kuitenkaan.

Tässä on taas monia samoja vikoja kuin aiemmin ja tietysti yksilöllisiä uusia vikoja.

1) Muuttujien nimet ovat jälleen surkeita, radio1 jne.

2) Yleensä käytetään välilyöntejä pilkun jälkeen ja =-merkin molemmin puolin parametreissa. Tuollaista yhtenäistä tekstiä on vaikea lukea, esimerkiksi kohdassa frame2,text="Laske",command=Laske.

3) Verotyypeistä kannattaisi tehdä vakiot (VEROTYYPPI_LAHJAVERO_1LK jne.) ja nämä voisivat olla tekstimuotoisia, ettei tarvitsisi koodissa kikkailla maagisilla numeroilla 1–4.

4) Laske-funktio käyttää taas globaaleja muuttujia, mikä on huono idea. Milloin opit erottamaan käyttöliittymän ja laskennan?

5) Taulukot voisi alustaa suoraan (=) eikä millään extendillä.

6) Taulukoiden data voisi itse asiassa olla yhdessä dict-muuttujassa, jotta ei tarvitsisi ollenkaan noita if-lauseita.

7) Käytä enemmän kuin yksi välilyönti sisennykseen! Noin pientä sisennystä on vaikea lukea.

Grez [16.07.2021 12:12:58]

#

Metabolix kirjoitti:

kannattaisi tehdä vaikka HTML-JS-yhdistelmällä ja julkaista koodilaatikon sijaan toimivina nettisivuina vaikka GitHub Pages -palvelun kautta. Sillä tavalla niistä olisi mahdollisesti jotain iloa tai hyötyä, koska tuskin kukaan laskuria kaipaava maallikko alkaa asentaa Pythonia ja ajaa vierasta skriptiä siinä

No eiköhän ne maallikot muutenkin hakeudu todennäköisemmin netissä jo oleviin (virallisen tahon ylläpitämiin) laskureihin

Lahjaverolaskuri
Perintöverolaskuri

muuskanuikku [16.07.2021 14:13:23]

#

Minä en näe itse, että käyttöliittymällä olisi mitään merkitystä sen suhteen, että kuka näitä koodeja välittää testata tai olisi edes kiinnostunut niistä. Algoritmit ovat vaikeustasoltaan ala-astematikkaa ja toteutus laadultaan todella huono.

Koodi on muotoiltu väärin ja koodin laatu on teknisestäkin näkökulmasta heikko. Jos algoritmi itsessään olisi kirjoitettu siististi ja järkevästi, niin silloin mielestäni shellisovelluksina nämä olisivat ehkä hyödyllisimmässä muodossaan. Eli turhan lomakenäkymän sijaan vaan tulostetaan lopputulos konsoliin vaikka taulukkomuodossa.

Jos joku oikeasti haluaa lisätä lahja- tai perintöveron laskennan omaan sovellukseensa, niin on nopeampaa etsiä kyseiset kaavat hakukoneella ja kirjoittaa oma koodi, kuin että yrittäisi tätä sekamelskaa lukemalla päätellä, kuinka verotus menee noin niin kuin matemaattiseksi kaavaksi formalisoituna.

Kuten Metabolix aiemmin antoi palautetta, niin tätä koodia katsomalla ei todellakaan voi ymmärtää, miksi tietyt mielivaltaiset numeroarvot on valittu ja mikä niiden merkitys on. Jos vaikka ensi keväänä jokin verokanta on muuttunut tai progressiivisia askelmia säädetty, niin ei kukaan tätä koodia osaa enää korjata toimivaksi, koska kukaan ei ymmärrä hevonhelvettiä, että mitä pitäisi muuttaa.

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta