Python - Tkinter Canvas


Canvas widget se koristi za dodavanje strukturisane grafike u python aplikaciju. Koristi se za crtanje grafikona i dijagrama u python aplikaciji. Sintaksa za korištenje Canvas-a je:

w = canvas(parent, options)  

Spisak mogućih opcija je dat u sljedećoj tabeli.

Opcija Opis
bd Predstavlja širinu border-a (granice). Zadana širina je 2.
bg Predstavlja boju pozadine platna (Canvas).
confine Postavljeno je tako da se platno ne može pomicati izvan područja pomicanja.
cursor Kursor miša se koristi kao strelica, krug, tačka, itd. na platnu.
height Predstavlja veličinu platna u vertikalnom smjeru.
highlightcolor Predstavlja boju isticanja kada je vidžet fokusiran.
relief Predstavlja vrstu bordera (granice). Moguće vrijednosti su: SUNKEN, RIISED, GROOVE i RIDGE.
scrollregion Predstavlja koordinate navedene kao tuple koji sadrži područje platna.
width Predstavlja širinu platna.
xscrollincrement Ako je postavljena na pozitivnu vrijednost. Platno se postavlja samo na viši sprat ove vrijednosti
xscrollcommand Ako se platno može pomicati, ovaj atribut bi trebao biti .set() metoda horizontalne trake za pomicanje.
yscrollincrement Radi kao xscrollincrement, ali upravlja vertikalnim kretanjem.
yscrollcommand Ako se platno može pomicati, ovaj atribut bi trebao biti .set() metoda vertikalne trake za pomicanje.

Primjer broj 1: Tkinter Canvas

from tkinter import *   
  
top = Tk()  
  
top.geometry("200x200")  
  
# Kreiranje jednostavnog platna (Canvas)
c = Canvas(top,bg = "pink",height = "200")  
  
c.pack()  
  
top.mainloop()

Prikaz koda iz gornjeg primjera izgledaće ovako:




Primjer broj 2: Tkinter Canvas - kreiranje luka

from tkinter import *   
  
top = Tk()  
  
top.geometry("200x200")  
  
# Kreiranje jednostavnog platna (Canvas)
c = Canvas(top,bg = "pink",height = "200",width = 200)  
  
arc = c.create_arc((5,10,150,200),start = 0,extent = 150, fill= "white")  
  
c.pack()  
  
top.mainloop()

Prikaz koda iz gornjeg primjera izgledaće ovako:




Primjer broj 3: Tkinter Canvas - kreiranje kvadrata

from tkinter import *

master = Tk()

w = Canvas(master, width=200, height=100)
w.pack()

w.create_rectangle(50, 20, 150, 80, fill="#476042")
w.create_rectangle(65, 35, 135, 65, fill="yellow")
w.create_line(0, 0, 50, 20, fill="#476042", width=3)
w.create_line(0, 100, 50, 80, fill="#476042", width=3)
w.create_line(150,20, 200, 0, fill="#476042", width=3)
w.create_line(150, 80, 200, 100, fill="#476042", width=3)

mainloop()

Prikaz koda iz gornjeg primjera izgledaće ovako:



Sada ćemo pogledati kako ispisati tekst na platnu. U tu svrhu ćemo proširiti i modifikovati prethodni primjer. Metoda create_text() se može primijeniti na objekt platna da se na njega upiše tekst. Prva dva parametra su pozicije x i y tekstualnog objekta. Prema zadanim postavkama, tekst je centriran na ovoj poziciji. Ovo možete poništiti opcijom sidra. Na primjer, ako koordinata treba biti gornji lijevi ugao, postavite sidro na SZ. Pomoću parametra ključne riječi text možemo definisati stvarni tekst koji će biti prikazan na platnu.

from tkinter import *

canvas_width = 200
canvas_height = 100

colours = ("#476042", "yellow")
box=[]

for ratio in ( 0.2, 0.35 ):
   box.append( (canvas_width * ratio,
                canvas_height * ratio,
                canvas_width * (1 - ratio),
                canvas_height * (1 - ratio) ) )

master = Tk()

w = Canvas(master, 
           width=canvas_width, 
           height=canvas_height)
w.pack()

for i in range(2):
   w.create_rectangle(box[i][0], box[i][1],box[i][2],box[i][3], fill=colours[i])

w.create_line(0, 0,                 # Porijeklo platna (canvas)
              box[0][0], box[0][1], # Koordinate lijevog gornjeg ugla box[0]
              fill=colours[0], 
              width=3)
w.create_line(0, canvas_height,     # Donji lijevi ugao platna
              box[0][0], box[0][3], # Donji lijevi ugao box[0]
              fill=colours[0], 
              width=3)
w.create_line(box[0][2],box[0][1],  # Desni gornji ugao box[0] 
              canvas_width, 0,      # Desni gornji ugao platna
              fill=colours[0], 
              width=3)
w.create_line(box[0][2], box[0][3], # Donji desni ugao box[0]
              canvas_width, canvas_height, # Donji desni ugao platna
              fill=colours[0], width=3)

w.create_text(canvas_width / 2,
              canvas_height / 2,
              text="Python")
mainloop()

Prikaz koda iz gornjeg primjera izgledaće ovako:



Interaktivno slikanje na patnu (Canvas)

Želimo da napišemo aplikaciju za slikanje ili pisanje na platnu. Nažalost, ne postoji način da se naslika samo jedna tačka na platnu. Ali ovaj problem možemo prevladati korištenjem malog ovala. Pogledajmo sljedeći primjer:

from tkinter import *

canvas_width = 500
canvas_height = 150

def paint( event ):
   python_green = "#476042"
   x1, y1 = ( event.x - 1 ), ( event.y - 1 )
   x2, y2 = ( event.x + 1 ), ( event.y + 1 )
   w.create_oval( x1, y1, x2, y2, fill = python_green )

master = Tk()
master.title( "Crtanje po platnu (Canvas)" )
w = Canvas(master, 
           width=canvas_width, 
           height=canvas_height)
w.pack(expand = YES, fill = BOTH)
w.bind( "<B1-Motion>", paint )

message = Label( master, text = "Pritisnite i prevucite miša za crtanje" )
message.pack( side = BOTTOM )
    
mainloop()

Prikaz koda iz gornjeg primjera izgledaće ovako:



Ako želite da nacrtate trokut, morate navesti najmanje tri koordinatne tačke: create_polygon(x0,y0, x1,y1, x2,y2, ...). U sljedećem primjeru crtamo trokut koristeći ovu metodu:

canvas_width = 200
canvas_height =200
python_green = "#476042"

master = Tk()

w = Canvas(master, 
           width=canvas_width, 
           height=canvas_height)
w.pack()

points = [0,0,canvas_width,canvas_height/2, 0, canvas_height]
w.create_polygon(points, outline=python_green, 
            fill='yellow', width=3)

mainloop()

Prikaz koda iz gornjeg primjera izgledaće ovako:



Bitmaps

Metoda create_bitmap() može se koristiti za uključivanje bitmapa na platno. Sljedeće bitmape su dostupne na svim platformama: "error", "gray75", "gray50", "gray25", "gray12", "pješčani sat", "info", "questhead", "question", "warning". Sljedeća skripta stavlja sve ove bitmape na platno (Canvas):

from tkinter import *

from tkinter import *

canvas_width = 300
canvas_height =80

master = Tk()
canvas = Canvas(master, 
           width=canvas_width, 
           height=canvas_height)
canvas.pack()

bitmaps = ["error", "gray75", "gray50", "gray25", "gray12", "hourglass", "info", "questhead", "question", "warning"]
nsteps = len(bitmaps)
step_x = int(canvas_width / nsteps)

for i in range(0, nsteps):
   canvas.create_bitmap((i+1)*step_x - step_x/2,50, bitmap=bitmaps[i])

mainloop()

Prikaz koda iz gornjeg primjera izgledaće ovako: