Haladó Python tkinter Canvas kódok 10 - 15.

 10./

Egy kártya játék, leosztás utáni lap cseréje. Például Snapszer esetén, a kézben lévő azonos színű  alsóval ki lehet cserélni a talon lapot. Ezt a folyamatot az egér jobb gombjával a tromfra kattintva lehet elindítani. Öt lap helyett a példában 3 lap van kézben.


import tkinter as tk
from tkinter import messagebox


root = tk.Tk()
root.geometry('300x300+900+100')

canvas = tk.Canvas(root, width=600, height=400,
background='green')
canvas.pack(anchor=tk.CENTER, expand=True)

# Változó definiálás
also = False

# ***************************************************


def also_csere():
"""Kattintásra megkeresi az alsót és kicseréli a
talon lapra."""
global also

# Megkapjuk az elem nevét és az aktuális eseményt
talon_tromf = canvas.gettags('tromf')
print(f'A kattintott elem és a kattintás ténye: {talon_tromf}')

# Ellenőrzi, hogy a jobb egér gombbal ...
# ... rákattintottak-e a talon tromf lapra.
try:
# Ha a kattintás helyesen megtörtént...
if talon_tromf[1] == 'current':
# ... nézze át a többi lapot van e köztük 2-es értékü.
for j in range(len(kepek)):
# A fájlista sztringből a 7 és 8 indexü szám elem
kartya_ertek = kepek_nevei[j][7:9]
print(f'\nA kézben lévő kártyák értéke: {kartya_ertek}')
# Lapszínek lekérése
kartya_szin = kepek_nevei[j][6]
print(f'{kartya_szin=}')
# A talon szín lekérése
talon_szin = tromf_neve[0][6]
print(f'{talon_szin=}')

if kartya_ertek == '02' and kartya_szin == talon_szin:
also = True
# Az alsó kártya koordinátái
also_koor = canvas.coords('kep' + str(j))
print(f"Az alsó kártyalap koordináta: {also_koor},")

# Az alsó lap cimke neve
also_nev = canvas.gettags('kep' + str(j))
print(f'Az alsó kártyalap kép neve: {also_nev}')

tromf_koor = canvas.coords('tromf')
print(f"A tromf kártyalap koordináta: {tromf_koor}")

# A képeket új csere koordinátákra helyezi
canvas.coords(talon_tromf[0], *also_koor)
canvas.coords(also_nev[0], *tromf_koor)
if also is False:
tk.messagebox.showinfo(
"Információ", "Nincs alsó a kézben!")

except IndexError:
tk.messagebox.showwarning(
"Figyelmeztetés", "Nem kattintottál a jobb egér\n"
"gombbal a tromf kártya lapra!")

# ****************************************************************


kepek_nevei = ['kepek/z02.png', 'kepek/t10.png', 'kepek/p11.png']
kepek = {}
jobbra = 0

# Csoportos képek megjelenítése
for i in range(len(kepek_nevei)):
kepek[i] = tk.PhotoImage(file=kepek_nevei[i])
canvas.create_image((100+jobbra, 70),
image=kepek[i], tags='kep' + str(i))
jobbra += 50
# print('kep' + str(i))

# *************************************************************

tromf_neve = ['kepek/z10.png']
# Egy külön álló kép megjelenítése
kep = tk.PhotoImage(file=tromf_neve[0])
t = canvas.create_image((50, 230), image=kep, tags='tromf')

# *************************************************************

# Egér jobbgomb kattintásra also_csere() függvény hívása
canvas.bind('<Button-3>', lambda e: also_csere())


root.mainloop()
Kártyajátékok létrehozásának vagy játszásának keretrendszere: 

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

11./

Hozz létre egy mappát, abba tedd bele a képekkel teli 'images' mappát és három Python fájlt, egy alkalmazás és két modul:

Alkalmazas1.py

import CanvasOOP1A as CA
import CanvasOOP1B as CB
import tkinter as tk

kep = ['images/m04.png', 'images/z10.png']


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

self.configure(bg='orange')
self.geometry('420x220+500+100')

at1 = CA.Athelyezes(self, kep[0])
at1.place(x=10, y=10)

at2 = CB.Athelyezes(self, kep[1])
at2.place(x=210, y=10)


if __name__ == '__main__':
app = App()
app.mainloop()

CanvasOOP1A.py

import tkinter as tk
from PIL import Image, ImageTk
kep = 'images/m11.png'


class Athelyezes(tk.Canvas):
def __init__(self, parent, file):
super().__init__(parent)

self.file = file

self.configure(width=200, height=200, bg='blue')

# Kép megnyitása
self.image = Image.open(self.file).resize((81, 128))
self.photo = ImageTk.PhotoImage(self.image)
# Kép megjelenítése
self.i = self.create_image((10, 10), anchor="nw",
image=self.photo)

# Egér bal gomb kattintásra függvény hívás
self.bind('<Button-1>', lambda e: self.updates())

def updates(self):
# A képet új koordinátákra helyezi
self.coords(self.i, 200, 50)


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

at = Athelyezes(self, kep)
at.pack()


if __name__ == '__main__':
app = App()
app.mainloop()

CanvasOOP1B.py

import tkinter as tk
kep = 'images/m02.png'


class Athelyezes(tk.Canvas):
def __init__(self, parent, file):
super().__init__(parent)

self.file = file

self.configure(width=200, height=200, bg='#D62828')

# Kép megnyitása
self.foto = tk.PhotoImage(file=self.file)
# Kép megjelenítése
self.i = self.create_image((10, 10), anchor="nw",
image=self.foto)

# Egér bal gomb kattintásra függvény hívás
self.bind('<Button-1>', lambda e: self.updates())

def updates(self):
# A képet új koordinátákra helyezi
self.coords(self.i, 200, 50)


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

at = Athelyezes(self, kep)
at.pack()


if __name__ == '__main__':
app = App()
app.mainloop()

Eredmény:

 
Kattints a kártyákra és keresd meg őket!😀

Kártyajátékok létrehozásának vagy játszásának keretrendszere: 

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


12./

Egy kép törlése és egy kép kihelyezése a Canvas-ból a tkinter ablakba. Kattintás a képre, és kattintás bárhová az ablakban. Képen az események utáni állapot.


Egy applikáció és két manager:

Alkalmazas2.py

import CanvasOOP2A as C2A
import CanvasOOP2B as C2B
import tkinter as tk

kep = [
'images/m04.png'] # makk király
kep_lista = ['images/p11.png', # piros ász
'images/p10.png'] # piros 10


class App(tk.Tk):
def __init__(self):
super().__init__()
self.label = None
# A tkinter ablak színe
self.configure(bg='orange')
# A tkinter ablak mérete és megjelenési helye
self.geometry('460x310+500+100')

# Osztály példányosítás
canvas1 = C2A.CanvasAblak1(self, kep_lista)
canvas1.place(
x=0, y=0)

canvas2 = C2B.CanvasAblak2(
self, kep[0])
canvas2.place(
x=0, y=146)
# osztály kép elérése
self.kartya = canvas2.foto
# inicializálás
self.canvas2 = canvas2

# bal gomb kattintásra
self.bind('<Button-1>', lambda e: self.frissites1())

def frissites1(self):
# Makk király a tkinter ablakba kerül.
self.label = tk.Label(self, image=self.kartya)
self.label.place(x=300, y=152)
# A makk király törlése a canvasból
self.canvas2.delete('kep')


if __name__ == '__main__':
app = App()
app.mainloop()

CanvasOOP2A.py

import tkinter as tk
from PIL import Image, ImageTk
kep_lista = ['images/m11.png',
'images/m10.png']


class CanvasAblak1(tk.Canvas):
def __init__(self, parent, file):
super().__init__(parent)

self.file = file
self.bind('<Button-3>')

# A canvas mérete
self.configure(width=190, height=144, bg='blue')

jobbra = 10
self.kepek_szotar = {}

for i in range(len(self.file)):
# képhívás
self.image = Image.open(self.file[i]).resize((81, 128))
# kép szótárazás
self.kepek_szotar[i] = ImageTk.PhotoImage(self.image)
# Kép megjelenítése
self.create_image((jobbra, 10), anchor="nw",
image=self.kepek_szotar[i], tags='kep' + str(i))
jobbra += 90

# A képre egér jobb gomb kattintásra metódus hívás
self.tag_bind('kep0', '<Button-3>', lambda e: self.updates())

def updates(self):
"""Kizárólag a képre kattintásra, egér
jobb gombbal törli az első (ász) képet."""
self.delete('kep0')


class App(tk.Tk):
def __init__(self):
super().__init__()
# osztály példányosítás
ca = CanvasAblak1(self, kep_lista)
ca.pack()


if __name__ == '__main__':
app = App()
app.mainloop()

CanvasOOP2B.py

import tkinter as tk
kep = 'images/m02.png'


class CanvasAblak2(tk.Canvas):
def __init__(self, parent, file):
super().__init__(parent)

self.file = file

self.configure(width=190, height=145, bg='#D62828')

# Kép megnyitása
self.foto = tk.PhotoImage(file=self.file)
# Kép megjelenítése (makk alsó)
self.create_image((10, 10), anchor="nw",
image=self.foto, tags='kep')


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

ca = CanvasAblak2(self, kep)
ca.pack()


if __name__ == '__main__':
app = App()
app.mainloop()
Kártyajátékok létrehozásának vagy játszásának keretrendszere: 

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

13./

Kattintásra kép áthelyezés egyik vászon ablakból a másik vászon ablakba.

Alkamazas3.py

import CanvasOOP3A as C3A
import CanvasOOP3B as C3B
import tkinter as tk

kep_lista = ['images/m04.png', 'images/p11.png']


class App(tk.Tk):
"""Az egyik canvas ablakból a másikba helyezi a képet."""
def __init__(self):
super().__init__()

self.configure(bg='orange')
self.geometry('415x225+500+100')
self.bind("<Button-1>", self.updates)

canvas1 = C3A.CanvasAblakA(self)
canvas1.place(x=10, y=10)
self.canvas1 = canvas1

canvas2 = C3B.CanvasAblakB(self, kep_lista[0])
canvas2.place(x=200, y=10)
# kép elérés m02 -> m04
self.kep = canvas2.kep
# A kép_lista index 0.
self.kiraly = canvas2.foto
# inicializálás
self.canvas2 = canvas2

# Egér bal gomb kattintás bárhova, függvény hívás
self.bind('<Button-1>', lambda e: self.updates())

def updates(self, ):
self.canvas1.create_image((10, 10), anchor="nw",
image=self.kiraly, tags='kiraly')
print(self.kep) # m04
self.canvas2.delete(self.kep)


if __name__ == '__main__':
app = App()
app.mainloop()

CanvasOOP3A.py

import tkinter as tk


class CanvasAblakA(tk.Canvas):
"""Ez egy üres canvas ablak."""
def __init__(self, container):
super().__init__(container)

self.configure(width=200, height=200, bg='blue')


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

caa = CanvasAblakA(self)
caa.pack()


if __name__ == '__main__':
app = App()
app.mainloop()

CanvasOOP3B.py

import tkinter as tk
kep_ut = 'images/m02.png'


class CanvasAblakB(tk.Canvas):
"""Törli a képet kattintásra."""
def __init__(self, container, kep_file):
super().__init__(container)

self.kep_file = kep_file
self.kep = kep_file[7:10]
print(self.kep) # m02

self.configure(width=200, height=200, bg='#D62828')

# Kép megnyitása
self.foto = tk.PhotoImage(file=self.kep_file)
# Kép megjelenítése
kartyalap = self.create_image((10, 10), anchor="nw",
image=self.foto, tags=self.kep)

# Egér balgomb kattintás a képre, függvény hívás.
self.tag_bind(kartyalap, '<Button-1>', lambda e: self.updates())

def updates(self):
self.delete(self.kep) # m02


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

cab = CanvasAblakB(self, kep_ut)
cab.pack()


if __name__ == '__main__':
app = App()
app.mainloop()
Kártyajátékok létrehozásának vagy játszásának keretrendszere: 

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

14./

Canvas betű lenyomási esemény, bind_all()

import tkinter as tk


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

self.title("Event")

self.canvas = tk.Canvas(self, bg='lightgreen', width=400, height=400)
self.canvas.pack(expand=1, fill=tk.BOTH)

# arrow= paraméterek;
# FIRST: Nyílhegy a vonal rajzolás kezdésén
# LAST: Nyílhegy a vonal rajzolás végén
# BOTH: Mind a két végén van nyílhegy
# arrowshape= nyílhegy méretei
self.canvas.create_line(0, 0, 100, 100, fill="red", width=3,
arrow='last', arrowshape=(20, 25, 5))

self.canvas.create_text(
200, 200, text='Az egér helyzete bal felső '
'sarokban: 0, 0.\n'
'Az alkalmazás ablakán balra ki,'
'és fel ki, mínusz értékek.\n'
'Az alkalmazás ablakán jobbra és '
'le pozitív értékek\n',
font='arial 12')

# Az eseményt a bind_all() metódussal is létrehozhatjuk.
# Ez az eseményt az egész monitorhoz fogja csatolni,
# nem pedig csak az elemhez, ami azt jelenti, hogy ez
# az esemény akkor is aktiválódik, ha az általunk használt
# elemnek nincs fókusza, nincs az egér rajta.
# Az egér hely adatok nyomtatása az "a" lenyomására.
self.canvas.bind_all('<a>', self.bilentyu_lenyomas_esemeny)

@staticmethod
def bilentyu_lenyomas_esemeny(event):
"""Ez a módszer kinyomtatja, hogy melyik betű
lenyomására történt esemény, mik voltak az
esemény koordinátái,
valamint az eseményt kiváltó Tkinter widget."""
# Az egér követése az egész Windows ablakban
print(f'Az <{event.char}> betű lenyomására: '
f'{event.x=}, {event.y=}, {event.widget=}')


if __name__ == "__main__":
esemeny = CanvasEvents()
esemeny.mainloop()

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

15./

Canvas itemconfigure() bemutatása, és néhány adat: bájt, memória cím megszerzése.

import os
import sys
import tkinter as tk


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

self.configure(bg='orange')
self.geometry('300x200+700+100')
self.title("Event")

self.canvas = tk.Canvas(self, bg='grey',
width=500, height=500)
self.canvas.pack(anchor=tk.CENTER, expand=True)
# 1. kep nyitás
self.foto1 = tk.PhotoImage(file='fotok/m02.png')
# kép megjelenítés
self.kep_keszites1 = self.canvas.create_image(
(100, 100), image=self.foto1)

# 2. kép nyitás
self.foto2 = tk.PhotoImage(file='fotok/kisnap.png')

# A képre kattintásra lecseréli az első fotót
# ... a második fotóra.
self.canvas.tag_bind(self.kep_keszites1, '<Button-1>',
self.kepre_katt)

def kepre_katt(self, event):
"""Megjeleníti az első fotó koordinátáján a második fotót."""
self.canvas.itemconfigure(event.num, image=self.foto2)
print(f'A kattintott objektum helye: '
f'{self.canvas.coords(event.num), event.num}')

# # Memóriaméret lekérdezése
memoria_meret_foto1 = sys.getsizeof(self.foto1)
memoria_meret_foto2 = sys.getsizeof(self.foto2)
print(f"\n{memoria_meret_foto1=} bájt")
print(f"{memoria_meret_foto2=} bájt")

# Fájl méretének lekérdezése
kisnap_fajl_meret = os.path.getsize("fotok/kisnap.png")
makkalso_fajl_meret = os.path.getsize("fotok/m02.png")
print(f"\n{kisnap_fajl_meret=} bájt")
print(f"{makkalso_fajl_meret=} bájt")

memoria_cim1 = id(self.foto1)
memoria_cim2 = id(self.kep_keszites1)
memoria_cim3 = id(self.foto2)
print(f'\n{memoria_cim1=}')
print(f'{memoria_cim2=}')
print(f'{memoria_cim3=}')


if __name__ == "__main__":
ablak = CanvasEvents()
ablak.mainloop()
A napocskát innen töltöttem le: https://pixabay.com/hu/

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

Folytatás a következő oldalon: Haladó Python tkinter Canvas kódok 16-




Nincsenek megjegyzések:

Megjegyzés küldése