Created
November 30, 2013 14:02
-
-
Save xobust/7719518 to your computer and use it in GitHub Desktop.
My final piece of code, in the beginers programing cource att my local "gymnasium". Definitly not my finest work
i never liked the tk way of doing things, and i used it the first time when i was 12 and now i am 17.
The program is a simple hotel booking gui that simply saves the info you select into a txt file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#encoding: Utf8 | |
#^^ Utf8 kodning gör så att aplikationene funkar för | |
# de flästa språk och teknen. | |
from Tkinter import * #Bibliotek för grafiskt användar grännsnit | |
from tkMessageBox import* #bibliotek för popup rutor | |
""" | |
Alexander Bladh 2013-30/11 | |
för att göra dethär programmet så börjar jag med | |
att skriva alla variabler, sedan göra jag dem till | |
tk gui object och katigoriserar och positionerar den | |
när jag är klar med designen så börjar jag med att | |
skriva funktionerna som kallas när jag använder gui objekten | |
så kallade hooks. | |
""" | |
#Konstants | |
Pris_per_night = 100 | |
#Functioner | |
def val_natt(): | |
natt_e.configure(text=antal_nat_i.get()) #sätter etiketens text | |
def val_person(): | |
pers_e.configure(text=antal_pers_i.get()) #sätter etiketens text | |
def val_tillval(): | |
#Functionen går igenom listan med värden från checkknapparna | |
#Sen så lägger den in det värdet i en ettiket. | |
i = 0 | |
for name in tillval_i_list: | |
if(tillval_i_list[name].get() > 0): | |
Tillval_e_List[i].configure(text = name + ", " + str(tillval_i_list[name].get())) | |
else: | |
Tillval_e_List[i].configure(text="") | |
i=i+1 | |
def calculate_price(): | |
#Funktion som summerar priset av valen du valt | |
tot_pris = 0; | |
tot_pris += (antal_nat_i.get() * antal_pers_i.get() * Pris_per_night) | |
for name in tillval_i_list: | |
tot_pris += tillval_i_list[name].get() | |
Pris_e.configure(text=str(tot_pris)) #sätter pris ettiketen till det uträknade priset | |
return tot_pris #returnerar priset för spar funktionen | |
def save(): | |
#Funktionen lägger kollar först datan sen för den | |
#in all information i variabeln data | |
#Som sedan skriver den till en fil | |
if(nam_en.get()=="" or antal_pers_i.get()==0 or antal_nat_i.get()==0): | |
showwarning("Ogiltig inmatning", "Se till att mata in namn antal personer och antal nätter") | |
return | |
#det är alltid bra att kontrolerara inputen en användare ger programmet | |
#i riktiga program så ska användas av många användare får ingen felaktig | |
#data gå in i databaser | |
#Därför kör man oftast så kallade unit tests eller doctests | |
data = "Namn: " + nam_en.get() + " Personer: " + str(antal_pers_i.get()) + " Antal nätter: " + str(antal_nat_i.get()) | |
data = data + " Tillval: " | |
#Har även laggt till så att tillval sparas med bokningen | |
for name in tillval_i_list: | |
if(tillval_i_list[name].get() > 0): | |
data = data + name + " " | |
File = open("bokning.txt", "w") | |
File.write(data) | |
File.close() #Glöm aldrig att stänga en i/o stöm när du är klar så att den kan användas av andra program | |
showinfo("Följande information har sparats", data) | |
def clearfeilds(): | |
#Jag har laggt till en funktion som | |
#tömmer alla fälten för att göra en ny bokning | |
#först sätts intvar variablerna | |
# och texterna | |
antal_nat_i.set(0) | |
antal_pers_i.set(0) | |
for name in tillval_i_list: | |
tillval_i_list[name].set(0) | |
Pris_e.configure(text=0) | |
nam_en.delete(0,END) #En annan funktion för att töma ett textfält | |
#sen uppdateras etiketterna | |
val_natt() | |
val_person() | |
val_tillval() | |
#Start av initierings kod | |
root = Tk(); #Skapar root element för tk fönstersystemet | |
root.title("Bokning av hotellrum") #Fönstrets namn | |
root.geometry("500x430") #Storleken på fönstret | |
# Topmenyn | |
top_m = Menu(root) | |
# Undermenyer | |
person_m = Menu(top_m) | |
tillval_m = Menu(top_m) | |
natt_m = Menu(top_m) | |
#lägger till menyn till fönstert | |
root.configure(menu=top_m) | |
#lägger till menyerna till huvudmenyerna | |
top_m.add_cascade(label = "Antal Personer", menu = person_m) | |
top_m.add_cascade(label = "Tillval", menu = tillval_m) | |
top_m.add_cascade(label = "Övernattning", menu = natt_m) | |
#Antal nätter | |
antal_nat_i = IntVar() #Variabel för antalet nätter valda | |
#lägger till alternativen till antal antal nätter menyn | |
natt_m.add_radiobutton(label = "1", value = 1, variable = antal_nat_i, command = val_natt) | |
natt_m.add_radiobutton(label = "2", value = 2, variable = antal_nat_i, command = val_natt) | |
natt_m.add_radiobutton(label = "3", value = 3, variable = antal_nat_i, command = val_natt) | |
natt_m.add_radiobutton(label = "4", value = 4, variable = antal_nat_i, command = val_natt) | |
#Antal personer | |
antal_pers_i = IntVar() | |
person_m.add_radiobutton(label = "1", value = 1, variable = antal_pers_i, command = val_person) | |
person_m.add_radiobutton(label = "2", value = 2, variable = antal_pers_i, command = val_person) | |
person_m.add_radiobutton(label = "3", value = 3, variable = antal_pers_i, command = val_person) | |
person_m.add_radiobutton(label = "4", value = 4, variable = antal_pers_i, command = val_person) | |
#Tillval | |
#Lista med namn och pris på tillval | |
tillva_list = {"Lastbil":100, "Grönbetor": 10,"Julbord":999, "1 kilo mjöl":17392} | |
#lista med namn och värdet på ett tillval (men bara om det är värt) | |
tillval_i_list = {"Lastbil":IntVar(), "Grönbetor": IntVar(),"Julbord":IntVar(), "1 kilo mjöl":IntVar()} | |
#Jag har valt att göra på dethär sättet eftersom det blir stökigt i koden | |
#om du ska skriva en variabel för varje tillval | |
#istället använder jag listor | |
#Läger till alla tillval från tillvals listan till tillvals menyn | |
for namn,pris in tillva_list.iteritems(): | |
tillval_m.add_checkbutton(label = namn, onvalue = pris, variable = tillval_i_list[namn], command = val_tillval) | |
#Grupper | |
Antal_g = LabelFrame(root, text = "Antal", padx=5, pady=5) | |
Antal_g.pack(padx = 10, pady = 5, fill = BOTH) | |
Tillval_g = LabelFrame(root, text = "Tillval", padx=5, pady=5) | |
Tillval_g.pack(padx = 10, pady = 5, fill = BOTH) | |
Pris_g = LabelFrame(root, text = "Tillval", padx=5, pady=5) | |
Pris_g.pack(padx = 10, pady = 5, fill = BOTH) | |
#Objekt i antal gruppen | |
Etikett1 = Label(Antal_g, text = "Antal personer") | |
Etikett1.pack(anchor="center") | |
pers_e = Label(Antal_g, text = 0) | |
pers_e.pack(anchor="center", padx=50) | |
Etikett2 = Label(Antal_g, text = "Antal nätter") | |
Etikett2.pack(anchor="center") | |
natt_e = Label(Antal_g, text = 0) | |
natt_e.pack(anchor="center") | |
Etikett3 = Label(Antal_g, text = "Namn") | |
Etikett3.pack(side="left") | |
Namn = StringVar() #sparar namnet som valts | |
nam_en = Entry(Antal_g, textvariable=Namn) | |
nam_en.pack(side="right") | |
#Objekt i Tillval gruppen | |
#Ettiketterna sparas i en lista för att kunna kallas med hjälp av en index variabel | |
Tillval_e_List = [Label(Tillval_g, text = "Ej valt"),Label(Tillval_g, text = "Ej valt"),Label(Tillval_g, text = "Ej valt"),Label(Tillval_g, text = "Ej valt")] | |
#listan loops och alla etiketterna packas för att visas på skärmen | |
for item in Tillval_e_List: | |
item.pack() | |
#Objekt i pris gruppen | |
Etikett4 = Label(Pris_g, text = "Pris",bg="green") | |
Etikett4.pack() | |
Pris_e = Label(Pris_g, text = "0") | |
Pris_e.pack() | |
#Objekt utanför ramarna | |
Pris_b = Button(root, text = "Beräkna pris", command=calculate_price) | |
Pris_b.pack(anchor="nw", side="left", pady=20) | |
Spara_b = Button(root, text = "Spara bokning", command=save) | |
Spara_b.pack(anchor="ne", side = "right", pady=20) | |
Clear_b = Button(root, text = "Ny bokning", command=clearfeilds) | |
Clear_b.pack(anchor="n", side = "bottom", pady=20) | |
root.mainloop() #kör fönstrens loop | |
""" | |
Överlag är jag ganska nöjd med min kod, men jag måste erkänna att jag inte gillar | |
tks sätt att skriva funktionerna, eftersom funktionerna defineras över variablerna | |
så går koden upp och ner så att säga. Jag hadde föredragit en lösning utan hooks | |
på ett mer c++ sätt. Objekten har en bra ordning även om namnen är något difusa | |
_e = etiket _en =entity osv. | |
Det finns inte så mycket att säga om presstandan eftersom det inte finns | |
några prestandakrävande delar, om det är något som kan optimeras så är det | |
att få ner funktionsanropen i hook funktionerna. Ett sätt att göra detta | |
är att ändra typerna för att få färre typecasts. | |
Någon form av unit test hadde också hjälpt för att testa programmet. | |
Ett sätt att undvika att koden går upp och ner är att ge funktionerna argument | |
och använda lambda: när du ger comand ett värde | |
Jag har valt att lägga till 2 saker till uppgiften, ett extra steg på sparningen | |
som kollar så att datan som sparas är ok annars varnas användaren och en knap som | |
skapar en ny bookning ( kallar en funktion som tömmer formuläret) | |
Alexander Bladh 2013-30/11 | |
""" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment