Udalosti (tlačidlá)

Štandardná myš má tri tlačidlá, môžeme jej v programe priradiť tri funkcie, ktoré sa vykonajú po ich stlačení. Geometrických tvarov, ktoré by sme potrebovali kresliť je omnoho viac, potrebujeme preto nástroje, ktorými môžeme rozšíriť možnosti nášho  grafického editora. Takýmto nástrojom je príkaz Button, ktorý vytvorí tlačidlo. Každému tlačidlu môžeme priradiť nejakú funkciu. 

Príkaz Button má tento základný tvar: b1=tkinter.Button(text=’xyz‘, command=prikaz) Navyše môžeme uviesť, v ktorom okne sa má tlačidlo zobraziť, aký typ a veľkosť písma sa má použiť, aká má byť farba pozadia, aká ikona sa má zobraziť, … Do programu z predchádzajúcej kapitoly som doplnil tlačidlá, vo vykreslení jednotlivých tvarov sa niekoľko riadkov pravidelne opakovalo, presunul som ich do novej funkcie nahodne a je v nej použitý nový typ – slovník (angl. dictionary) – v slovníku sú prvky v zložených zátvorkách,  kľúče a k nim priradené hodnoty sú oddelené dvojbodkou. Pomocou tohto typu máme v jednej premennej všetky parametre, ktoré potrebujeme a tieto parametre sú pomenované, takže ak niekto číta zdrojový text, vie čo ten ktorý parameter znamená. Procedúry kruh a štvorec som upravil tak, že tam kde stlačíme tlačidlo myši bude stred kruhu alebo štvorca. Keď stlačíme nejaké tlačidlo, vybrané tlačítko by malo mať inú farbu, než ostatné, používateľ tak vie, ktorý tvar je práve aktívny. Po úpravách program vyzerá takto:

import tkinter,random,math
platno = tkinter.Canvas(width=800,height=600,bg="white")
platno.pack()
tlacidla=tkinter.Tk(screenName='Tlačidlá')
platno2 = tkinter.Canvas(tlacidla,width=300,height=40,bg="white")
platno2.pack()

def nahodne():
    p={'r':5,'farba':'black','okraj':'black','hrubka':10}
    farby=('black','blue','brown','yellow','grey','orange','red','purple','pink',
           'skyblue','white')
    p["r"]=random.randrange(5,100)
    p["farba"]=random.choice(farby)
    p["okraj"]=random.choice(farby)
    p["hrubka"]=random.randrange(0,p['r']//2)
    return p
    
def kruh(x,y):
    p=nahodne()
    platno.create_oval(x-p["r"],y-p["r"],x+p["r"],y+p["r"],
                       fill=p["farba"],outline=p["okraj"],width=p["hrubka"])

def stvorec(x,y):
    p=nahodne()
    platno.create_rectangle(x-p["r"],y-p["r"],x+p["r"],y+p["r"],
                       fill=p["farba"],outline=p["okraj"],width=p["hrubka"])
def trojuholnik(x,y):
    p=nahodne()
    platno.create_polygon(x-p["r"],y,x+p["r"],y,x,y+p["r"],
                       fill=p["farba"],outline=p["okraj"],width=p["hrubka"])
    
def ciara(x,y):
    global body    
    p=nahodne()
    body.append([x,y])
    print(body)
    platno.create_line(body,fill=p["farba"],width=p["hrubka"])
  
def kresli(event):
    global tvar
    print(tvar)
    if tvar==0:
        kruh(event.x,event.y)
    if tvar==1:
        stvorec(event.x,event.y)
    if tvar==2:
        trojuholnik(event.x,event.y)
    if tvar==3:
        ciara(event.x,event.y)
    if tvar==4:
        mnohouholnik(event.x,event.y)

def zmenfarbub(tvar):
    global b
    for bi in b:
        bi.config(bg='#dddddd')
    b[tvar].config(bg='skyblue')
def setkruh():
    global tvar
    tvar=0
    zmenfarbub(tvar)
def setstvorec():
    global tvar
    tvar=1
    zmenfarbub(tvar)

def settroj():
    global tvar
    tvar=2
    zmenfarbub(tvar)

def setciara():
    global tvar,body
    tvar=3
    body=[]
    zmenfarbub(tvar)
    

tvar=1
b=[] #zoznam tlačidiel
b.append(tkinter.Button(tlacidla,text='Kruh', command=setkruh,font='arial 16')) #pridanie tlačidla do zoznamu tlačidiel
b[0].pack(side=tkinter.LEFT)
b.append(tkinter.Button(tlacidla,text='Štvorec', command=setstvorec,font='arial 16'))
b[1].pack(side=tkinter.RIGHT)
b.append(tkinter.Button(tlacidla,text='Trojuholník', command=settroj,font='arial 16'))
b[2].pack(side=tkinter.LEFT)
b.append(tkinter.Button(tlacidla,text='Čiara', command=setciara,font='arial 16'))
b[3].pack(side=tkinter.RIGHT)
platno.bind("<Button-1>", kresli)
platno2.bind("<Button-1>",setfarba)
platno.mainloop()

print

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *