Skip to content

Instantly share code, notes, and snippets.

@xobust
Created November 30, 2013 14:02
Show Gist options
  • Save xobust/7719518 to your computer and use it in GitHub Desktop.
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.
#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