Lekcja 11 - Nikola Horn

Generator kodów QR z działającym przyciskiem Zapisz i użyciem biblioteki customtkinter
import tkinter as tk
import customtkinter as ck
import qrcode
from PIL import ImageTk, Image
def kodqr():
global obrazek, przycisk
dane = linkqr.get()
qrobrazek = qrcode.make(dane)
obrazek = ImageTk.PhotoImage(qrobrazek)
qr_label.configure(image=obrazek)
przycisk = ck.CTkButton(okno, text="Zapisz", command=zapis)
przycisk.pack(side = "bottom", pady=10)
def zapis():
obrazekzapis = ImageTk.getimage(obrazek)
obrazekzapis.save("kodqr.gif")
okno = ck.CTk()
okno.title("Generator QRCode")
okno.config(padx=40, pady=40)
ck.set_appearance_mode("dark")
etykieta = ck.CTkLabel(okno, text="Wklej link w pole poniżej:")
etykieta.pack(pady=10)
linkqr = ck.CTkEntry(okno, width=80)
linkqr.pack()
przycisk = ck.CTkButton(okno, text="Generuj!", command=kodqr)
przycisk.pack(pady=10)
qr_label = ck.CTkLabel(okno, text="")
qr_label.pack(pady=10)
okno.mainloop()
Tkinter - przykłady różnych obiektów
import tkinter as tk
#do odczytania pola tekstowego metoda get
def powitanie():
witaj.configure(text=f"Witaj {wprowadz.get()}")
okno = tk.Tk()
okno.title("Jakiś tytuł")
okno.geometry("500x300")
etykieta = tk.Label(okno, text="Wpisz swoję imie:")
etykieta.pack()
wprowadz = tk.Entry(okno, width=80)
wprowadz.pack()
przycisk = tk.Button(okno, text="Wciśnij mnie!", command=powitanie)
przycisk.pack()
witaj = tk.Label(okno, text="")
witaj.pack()
okno.mainloop()
Notatki z zajęć
global nazwa_zmiennej
- global - robi zmienną globalną, którą można używać wewnątrz i zewnątrz pętli/def funkcji itp.
def kodqr():
pass
- pass - "a placeholder for future code. When the pass statement is executed, nothing happens, but you avoid getting an error when empty code is not allowed. Empty code is not allowed in loops, function definitions, class definitions, or in if statements."
GUI
GUI czyli graficzny interfejs użytkownika, interfejs graficzny, środowisko graficzne, z ang. graphical user interface. Jest to sposób przedstawienia informacji przez komputer, a także interakcji z użytkownikiem.
Najbardziej charakterystycznymi elementami GUI są: okna, ikony, przyciski, rozwijane menu, paski przewijania.
Do najpopularniejszych bibliotek do tworzenia komponentów i mechanizmów GUI należą:
- TkInter - dostarczony razem z Pythonem. Minusem jest brzydki wygląd, stąd wiele bibliotek poprawiających jego wygląd, takich jak customtkinter
- Qt (Pyside, PyQt) - jeden z najpopularniejszych frameworków GUI
- GTK (PyGObject) - wykorzystywany m.in. przez środowisko graficzne GNOME. Minusem jest to, że nie zawsze integruje się dobrze z innymi środowiskami.
- Kivy - wykorzystywany przy bardziej nietypowych interfejsach, np. na urządzenia mobilne
- DearPyGUI - zapewnia wsparcie wyświetlania z wykorzystaniem GPU
- Flet - stosunkowo nowy, umożliwia wykorzystanie frameworku Flutter w Pythonie
TkInter

install tkinter
import tkinter as tk
Pierwsze co zazwyczaj robimy to stworzenie okna:
okno = tk.Tk()
okno.title("Tytuł")
okno.geometry("500x300")
okno.config(padx=40, pady=40)
.geometry i .config są opcjonalne - dodają nam możliwość ustalenia stałego rozmiaru okna (domyślnie jest tak duże, żeby zmieściły się w nim wszystkie elementy) i np. "padów"
na końcu trzeba pamiętać o:
okno.mainloop()
Podstawowymi komponentami są:
- etykietka - label - tk.Label
etykieta = tk.Label(okno, text="Wpisz swoję imie:")
etykieta.pack()
- przycisk - button - tk.Button
przycisk = tk.Button(okno, text="Wciśnij mnie!")
przycisk.pack()
- pole do wpisywania - input - tk.Entry
wprowadz = tk.Entry(okno, width=80)
wprowadz.pack()
- ramka - frame - tk.Frame (pozwala na organizację elementów)
ramka=tk.Frame()
ramka.pack()
Metody rozmieszczania komponentów:
Pack - rozmieszcza komponenty półautomatycznie w obrębie rodzica
- side
- fill - czy element ma być rozciągnięty w daną stronę
- padx, pady - odstępy na zewnątrz komponentu
- ipadx, ipady - odstępy wewnątrz komponentu
przycisk = tk.Button(okno, text="Wciśnij mnie!")
przycisk.pack(side="right")
#może być też "left", "top" i "bottom"
Grid - elementy rozmieszczane są na siatce wierszy i kolumn (jak arkusz kalkulacyjny). Można sobie zaplanować aplikację w arkuszu. Element w lewym górnym rogu będzie w wierszu 0, kolumnie 0.
- colspan/rowspan - ile kolumn/wierszy może zająć element
- sticky - kierunek wypełnienia (n, s, w, e, we, ns)
przycisk = tk.Button(ramka, text="Wciśnij mnie!", width=15)
przycisk.grid(row=0, column=0)
przycisk = tk.Button(ramka, text="Wciśnij mnie!")
przycisk.grid(row=10, column=4)
etykieta = tk.Label(ramka, text="aaaaaaaaaaaaaaaaaaaaaa")
etykieta.grid(row=2, column=0, columnspan=3)
wprowadz = tk.Entry(ramka)
wprowadz.grid(row=2, column=4, columnspan=3, sticky="we")
Można włożyć elementy, które są w gridzie do ramki, żeby je wszystkie wycentrować (najprostszy sposób):
import tkinter as tk
okno = tk.Tk()
okno.title("Jakiś tytuł")
okno.geometry("500x300")
ramka=tk.Frame()
ramka.pack()
przycisk = tk.Button(ramka, text="Wciśnij mnie!", width=15)
przycisk.grid(row=0, column=0)
przycisk = tk.Button(ramka, text="Wciśnij mnie!")
przycisk.grid(row=10, column=4)
etykieta = tk.Label(ramka, text="aaaaaaaaaaaaaaaaaaaaaa")
etykieta.grid(row=2, column=0, columnspan=3)
wprowadz = tk.Entry(ramka)
wprowadz.grid(row=2, column=4, columnspan=3, sticky="we")
okno.mainloop()
Biblioteki Pillow i Qrcode
Pillow - do obsługi obrazków
pip install pillow
import PIL
from PIL import ImageTK
#to zaimportuje tylko jeden komponent biblioteki
QRcode - do obsługi kodów QR
pip install qrcode
import qrcode
Customtkinter - poprawia wygląd TkInter, można w nim ustawić appearance_mode i wiele innych rzeczy
install customtkinter
import customtkinter as ck
okno = ck.CTk()
okno.title("Generator QRCode")
okno.config(padx=40, pady=40)
ck.set_appearance_mode("dark")
