Övning 6

Behandlar grafik med Tkinter.

from Tkinter import *

I vanliga fall när vi importerar moduler brukar vi göra på följande sätt:

import random
print random.randrange(10)

För att slippa skriva random före varje anrop till en funktion i random kan man istället importera modulen på följande vis:

from random import *
print randrange(10)

Detta har vi nytta av när vi ska skapa grafiska program eftersom vi då måste använda väldigt många klasser och metoder som ligger i en modul som heter Tkinter. Då vill vi slippa skriva Tkinter hela tiden. Därför inleder vi programmen såhär:

from Tkinter import *

Vad finns i Tkinter?

För att få en överblick över Tkinter kommer här en lista på några av de klasser (med tillhörande metoder och attribut) som finns i modulen. Långt ifrån alla klasser, metoder och attribut är med i denna lista men det här är förmodligen de du kommer att ha störst användning för.

Exempel

Här kommer några exempel på hur man använder sig av klasserna i Tkinter.

Räkna antal klick

from Tkinter import *

def klickat():
    global c
    c += 1
    knapp["text"] = str(c)+" klick"

c = 0
t = Tk()
knapp = Button(t,text="Klicka", command=klickat)
knapp.grid()
t.mainloop()

Rövarspråket med grafik

from Tkinter import *

KONSONANTER = ('B','C','D','F','G','H','J','K','L','M','N','P',
               'Q','R','S','T','V','W','X','Y','Z')

def kryptera():
    texten = textruta.get(0.0,END)
    nytext = ""
    for bokstav in texten:
        if bokstav.upper() in KONSONANTER:
            nytext += bokstav + "o" + bokstav
        else:
            nytext += bokstav
    textruta.delete(0.0,END)
    textruta.insert(0.0,nytext)

rot = Tk()
rubrik = Label(rot,text="Ange en text")
#textruta = Entry(rot)
textruta = Text(rot)
knapp = Button(rot,text="Kryptera",command=kryptera)
rubrik.grid()
textruta.grid()
knapp.grid()
rot.mainloop()

Kön

from Tkinter import *

def valjer():
    entResultat.delete(0,END)
    entResultat.insert(0,"Du är en "+kon.get()+"!")


rot = Tk()
kon = StringVar()
Label(rot,text="Kön:").pack(anchor=W)
Radiobutton(rot,variable=kon,value="man",text="Man",command=valjer).pack(anchor=W)
Radiobutton(rot,variable=kon,value="kvinna",text="Kvinna",command=valjer).pack(anchor=W)
entResultat = Entry(rot,text="Inget kön valt")
entResultat.pack()
rot.mainloop()

Canvas

from Tkinter import *
rot = Tk()
c = Canvas(rot, width=200, height=350)
c.create_oval(50,50,90,100)
c.create_oval(110,50,150,100)
c.create_rectangle(25,25,175,325)
c.pack()
rot.mainloop()

Grafik genom arv

För att programmen inte ska bli så röriga när man har många grafiska objekt så kan man skapa klasser som ärver av Frame och som på så sätt kan innehålla grafiska objekt. Detta är även väldigt bra för att kunna återanvända delar av sin kod. Exemplet nedan gör samma sak som första exemplet, det räknar antalet klick, men det gör det i en klass.

from Tkinter import *

class Application(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        self.grid()
        self.skapa_saker()
        self.antal_klick = 0

    def skapa_saker(self):
        self.btn1 = Button(self,text="Klicka här", command=self.klickat)
        self.btn1.pack()
        
    def klickat(self):
        self.antal_klick += 1
        self.btn1["text"] = str(self.antal_klick) + " klick"


rot = Tk()
app = Application(rot)
rot.mainloop()