Lekcja 11 - Nikola Horn

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żą:

  1. TkInter - dostarczony razem z Pythonem. Minusem jest brzydki wygląd, stąd wiele bibliotek poprawiających jego wygląd, takich jak customtkinter
  2. Qt (Pyside, PyQt) - jeden z najpopularniejszych frameworków GUI
  3. GTK (PyGObject) - wykorzystywany m.in. przez środowisko graficzne GNOME. Minusem jest to, że nie zawsze integruje się dobrze z innymi środowiskami.
  4. Kivy - wykorzystywany przy bardziej nietypowych interfejsach, np. na urządzenia mobilne
  5. DearPyGUI - zapewnia wsparcie wyświetlania z wykorzystaniem GPU
  6. Flet - stosunkowo nowy, umożliwia wykorzystanie frameworku Flutter w Pythonie

TkInter

tkinter — Python interface to Tcl/Tk
Source code: Lib/tkinter/__init__.py The tkinter package (“Tk interface”) is the standard Python interface to the Tcl/Tk GUI toolkit. Both Tk and tkinter are available on most Unix platforms, inclu…
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ą:

  1. etykietka - label - tk.Label
etykieta = tk.Label(okno, text="Wpisz swoję imie:")
etykieta.pack()
  1. przycisk - button - tk.Button
przycisk = tk.Button(okno, text="Wciśnij mnie!")
przycisk.pack()
  1. pole do wpisywania - input - tk.Entry
wprowadz = tk.Entry(okno, width=80)
wprowadz.pack()
  1. 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")
Official Documentation And Tutorial | CustomTkinter
CustomTkinter is a python desktop UI-library based on Tkinter, which provides modern looking and fully customizable widgets.