Haladó Python tkinter Canvas Kódok 21-26

21./

Kérek egy üdítőt és egy fagyit az asztalra! Egér bal és jobb gomb húzással. 

import tkinter as tk
from PIL import Image, ImageTk


class EgerMozgatas(tk.Tk):
def __init__(self):
super().__init__()

self.canvas = tk.Canvas(self, width=600, height=400, bg="blue")
self.canvas.pack(padx=5, pady=5)

# Kép társítás a Canvas-hoz
self.image0 = ImageTk.PhotoImage(Image.open('kepek/asztal.png'))
self.image1 = ImageTk.PhotoImage(Image.open('kepek/cupcake1.png'))
self.image2 = ImageTk.PhotoImage(Image.open('kepek/glass2.png'))
self.img0 = self.canvas.create_image(
100, 250, anchor='nw', image=self.image0)
self.img1 = self.canvas.create_image(
450, 50, anchor='nw', image=self.image1)
self.img2 = self.canvas.create_image(
50, 50, anchor='nw', image=self.image2)

# Egér bal gomb és a mozgatási függvény összekötése:
self.canvas.bind("<B1-Motion>", lambda e: self.move1(e))
# Egér jobb gomb és a mozgatási függvény összekötése:
self.canvas.bind("<B3-Motion>", lambda e: self.move2(e))

# függvények, melyek lehetővé teszik
# .. a kép mozgását a vásznon belül
def move1(self, e):
self.image1 = ImageTk.PhotoImage(Image.open('kepek/cupcake1.png'))
self.img1 = self.canvas.create_image(e.x, e.y, image=self.image1)

def move2(self, e):
self.image2 = ImageTk.PhotoImage(Image.open('kepek/glass2.png'))
self.img2 = self.canvas.create_image(e.x, e.y, image=self.image2)


if __name__ == '__main__':
win = EgerMozgatas()
win.mainloop()
Chrystal Elizabeth képe a Pixabay -en.

OpenClipart-Vectors képe a Pixabay -en.

Clker-Free-Vector-Images képe a Pixabay -en.

*********************************************************************

22./

Kép elrejtése, mutatása kattintással vagy gombnyomással.

import tkinter as tk
from tkinter import ttk
from PIL import ImageTk


class RejtMutat(tk.Tk):
"""Gombnyomásra, de kattintásra is
elrejt - látszik képesemény."""
def __init__(self):
super().__init__()

self.geometry("300x200")
self.stilus = ttk.Style()
self.stilus.theme_use('alt')

self.mutat = True

self.canvas = tk.Canvas(self, width=440,
height=300, bg='lightgreen')
self.canvas.place(x=0, y=0)

self.kep = ImageTk.PhotoImage(file="kepek/m07.png")
self.canvas.create_image(200, 70,
image=self.kep, anchor='center')
# Gombnyomásra
gomb = ttk.Button(self, text="Mutat/Rejt",
command=self.rejt_mutat)
gomb.place(x=10, y=10)

# Kattintásra
self.canvas.bind('<Button-1>', lambda e: self.rejt_mutat())

def rejt_mutat(self):
# Határozza meg, hogy a kép rejtett-e vagy sem
if self.mutat is True:
self.canvas.itemconfig(1, state='hidden')
self.mutat = False
else:
self.canvas.itemconfig(1, state='normal')
self.mutat = True


if __name__ == '__main__':
win = RejtMutat()
win.mainloop()

*********************************************************************

23./

Objektum folyamatos mozgása, irányítás nyíl billentyűkkel. Leállítás: Enter.

import tkinter as tk


class FolyamatosMozgas(tk.Canvas):
"""Nyilakkal irányított folyamatos mozgás,
Enter gomb folyamat megállító."""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.configure(background='lightgreen')

# koordináták
self.dx = 0
self.dy = 0

# Fekete nényzet készítés
self.black_box = self.create_rectangle(0, 0, 15, 15,
fill="black")

# 1 Másodperc = 1000 Milliszekundum
self.milliszekundum = 50
self.fut = True

# metódus hívás
self.folyamat()

def folyamat(self):
if self.fut:
# A négyzet indulási helyezete beállítva
self.move(self.black_box, self.dx, self.dy)

# A függvény újra hívási ideje
self.after(self.milliszekundum, self.folyamat)

def modosit(self, dx, dy):
self.dx = dx
self.dy = dy

def stop_ido(self):
self.fut = False
tk.Label(self, text='Mozgási folyamat leállítva.',
bg='lightgreen').pack()


class Alkalmazas(tk.Tk):
def __init__(self):
super().__init__()

self.geometry("300x300")

folyamatos = FolyamatosMozgas(self)
folyamatos.pack(fill="both", expand=True)

lep_szam = 3

# Vízszintes mozgások
self.bind("<KeyPress-Left>",
lambda _: folyamatos.modosit(-lep_szam, 0))
self.bind("<KeyPress-Right>",
lambda _: folyamatos.modosit(lep_szam, 0))
# függőleges mozgások
self.bind("<KeyPress-Up>",
lambda _: folyamatos.modosit(0, -lep_szam))
self.bind("<KeyPress-Down>",
lambda _: folyamatos.modosit(0, lep_szam))

# A folyamat leállítása
self.bind('<Return>', lambda _: folyamatos.stop_ido())


if __name__ == "__main__":
app = Alkalmazas()
app.mainloop()

*********************************************************************

24./

Vigyázz ha jön a fal! 

Ha nem kell a print(), töröld ki!

import tkinter as tk


def move_left():
# A foci bal felső "sarka"=(x1, y1) és a
# foci jobb alsó "sarka"=(x2, y2)
x1, y1, x2, y2 = canvas.bbox("ball")
if x1 <= 0:
print('Ez a fal! Ez a fal!')
else:
canvas.move(foci, -5, 0)
print(f"\nBalra -5 pixel, x1 és x2")
print(canvas.bbox('ball'))


def move_right():
x1, y1, x2, y2 = canvas.bbox("ball")

if x2 >= canvas.winfo_width():
print(f'\nAblak szélesség = {canvas.winfo_width()}!')
print('Itt a fal! Itt a fal!')
else:
canvas.move(foci, 5, 0)
print(f"\nJobbra 5 pixel, x1 és x2")
print(canvas.bbox('ball'))


def move_up():
x1, y1, x2, y2 = canvas.bbox("ball")
if y1 <= 0:
print('Bumm! Ez a fal!')
else:
canvas.move(foci, 0, -5)
print("\nFel -5 pixel")
print(canvas.bbox('ball'))


def move_down():
x1, y1, x2, y2 = canvas.bbox("ball")

if y2 >= canvas.winfo_height():
print(f'Lejöttem a falig! {y2}')
else:
canvas.move(foci, 0, 5)
print("\nLe 5 pixel")
print(canvas.bbox('ball'))


if __name__ == '__main__':
root = tk.Tk()
root.title('Ablak mérete: 500x300')
root.geometry('500x300+500+100')

canvas = tk.Canvas(root, bg='lightblue',
highlightthickness=0)
canvas.pack(fill="both", expand=True)

image = tk.PhotoImage(file='kepek/foci.png')
# Foci jelenjen meg a bal felső sarokban!
foci = canvas.create_image(0, 0, image=image,
anchor=tk.NW, tags="ball")
# Négyzet a foci körűl
negyzet = canvas.create_rectangle(0, 0, 160, 160,
outline='red')

root.bind('<Right>', lambda _: move_right())
root.bind('<Left>', lambda _: move_left())
root.bind('<Up>', lambda _: move_up())
root.bind('<Down>', lambda _: move_down())

root.mainloop()

OpenClipart-Vectors képe a Pixabay -en.

*********************************************************************

25./

Fogd és vidd! 

import tkinter as tk


class Bemutato(tk.Frame):
"""Mutassa be, hogyan húzhat át elemeket egy ablakban."""
def __init__(self, parent):
tk.Frame.__init__(self, parent)
# A frame háttérszíne
self.configure(bg='lightgreen')
# create a canvas
self.canvas = tk.Canvas(self, width=400,
height=400, background="lightblue")
self.canvas.pack(padx=10, pady=10, fill="both", expand=True)

# Ezeket az adatokat a húzott elem nyomkövetésére használják.
# Kezdési adatok.
self._nyomkovetes = {"x": 0, "y": 0, "tétel": 0}

# Hozzon létre két mozgatható tárgyat, metódus hívással
self.keszits_targyat(100, 100, "orange")
self.keszits_targyat(200, 100, "grey")

# Kötések hozzáadása a kattintáshoz, húzáshoz és elengedéshez
# ...bármelyik "tárgy" címkével rendelkező objektumhoz.
# egér bal gomb lenyom
self.canvas.tag_bind(
"tárgy", "<ButtonPress-1>", self.huzas_kezdes)
# Egér bal gomb felenged
self.canvas.tag_bind(
"tárgy", "<ButtonRelease-1>", self.huzas_alj)
# Egeret lenyomott bal gombbal mozgat.
self.canvas.tag_bind(
"tárgy", "<B1-Motion>", self.huzas)

# A készíts_tárgyat() függvényhez magyarázat.
# self.canvas.create_oval(75, 75, 125, 125, outline='red', width=2)

def keszits_targyat(self, x, y, color):
"""Hozzon létre egy tárgyat a megadott
koordinátán a megadott színben"""
# A kör középpontja 100, 100. A "sarkai" 100-25 és 100+25
self.canvas.create_oval(
x - 25,
y - 25,
x + 25,
y + 25,
outline=color,
fill=color,
tags="tárgy")

def huzas_kezdes(self, event):
"""Egy objektum húzásának kezdete."""
# Jegyezze fel az elemet 1-es vagy 2-es ...
self._nyomkovetes["tétel"] = self.canvas.find_closest(
event.x, event.y)[0]
# print(self.canvas.find_closest(event.x, event.y)[0])
# ...és annak helyét.
self._nyomkovetes["x"] = event.x
self._nyomkovetes["y"] = event.y
# print(self._nyomkovetes["x"], self._nyomkovetes["y"])

def huzas_alj(self, event):
"""Egy objektum húzásának befejezése."""
# A húzási információk visszaállítása a kezdési értékekre.
self._nyomkovetes["tétel"] = 0
self._nyomkovetes["x"] = 0
self._nyomkovetes["y"] = 0

def huzas(self, event):
"""Egy objektum húzásának kezelése"""
# kiszámolja, mennyit mozgott az egér,
# új helyzet - régi helyzet
delta_x = event.x - self._nyomkovetes["x"]
delta_y = event.y - self._nyomkovetes["y"]
# A tárgy mozgása
self.canvas.move(
self._nyomkovetes["tétel"], delta_x, delta_y)
# Az új pozíció rögzítése
self._nyomkovetes["x"] = event.x
self._nyomkovetes["y"] = event.y


if __name__ == "__main__":
root = tk.Tk()
root.geometry('410x410+500+100')
Bemutato(root).pack(fill="both", expand=True)
root.mainloop()

*********************************************************************

26./

Melyik van közelebb, ha kattintok?

import tkinter as tk


class MyClass(tk.Tk):
def __init__(self):
super().__init__()

self._inicializalasok()

def _inicializalasok(self):
self.canvas = tk.Canvas(self)
self.canvas.pack()
self.canvas.bind("<Button-1>", self.kozelebb)

# Objektumok készítése
self.objektum_nevek = {}
kor = self.canvas.create_oval(50, 50, 70, 70, fill="Red")
self.objektum_nevek[kor] = 'Red object'
kor = self.canvas.create_oval(150, 150, 170, 170, fill="Blue")
self.objektum_nevek[kor] = 'Blue object'
kor = self.canvas.create_oval(250, 20, 270, 40, fill="Green")
self.objektum_nevek[kor] = 'Green object'

self.label1 = tk.Label(
self, text='Kattintáshoz a legközelebbi objektum:')
self.label1.pack(side=tk.LEFT)

self.nev_valtozo = tk.StringVar(value='')
self.label2 = tk.Label(self, textvariable=self.nev_valtozo)
self.label2.pack(side=tk.LEFT)

def kozelebb(self, event):
# Walrus (Rozmár) operátor használata
if legkozelebb := self.canvas.find_closest(event.x, event.y):
obj_id = legkozelebb[0]
print(obj_id)
self.nev_valtozo.set(self.objektum_nevek[obj_id])


if __name__ == '__main__':
root = MyClass()
root.mainloop()

*********************************************************************

Következő oldal: https://teljesenkezdo.blogspot.com/p/create-multiple-images-in-loop.html

Nincsenek megjegyzések:

Megjegyzés küldése