gnu code pro ColorPicker s Matplotlib a Tkinterem

 

import cv2 # Importování knihovny OpenCV pro manipulaci s obrázky
import matplotlib.pyplot as plt # Importování knihovny Matplotlib pro vizualizaci dat
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk # Importování nástrojů pro propojení Matplotlibu s Tkinterem
import tkinter as tk # Importování knihovny Tkinter pro tvorbu grafických uživatelských rozhraní


def main():
 <--- ODSAZENÍ PRO  FUNKCI MAIN ---> 
# Vytvoření okna Tkinteru
root = tk.Tk()

# Dialog pro výběr obrázku
filename = tk.filedialog.askopenfilename(
filetypes=(
("Images", (".bmp", ".jpg", ".png")), # Filtrování typů souborů
("All files", "*.*"),
)
)
if not filename: # Pokud uživatel nevybere žádný soubor, ukončíme funkci
return
# Načtení obrázku pomocí OpenCV a konverze barevného prostoru na RGB
image = cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2RGB)

# Vytvoření instance Matplotlibu pro zobrazení obrázku
fig, ax = plt.subplots()
ax.imshow(image)

# Propojení Matplotlibu s Tkinterem pomocí instance FigureCanvasTkAgg
fig_canvas = FigureCanvasTkAgg(fig, root)
# Získání widgetu Tkinteru pro zobrazení grafu a jeho umístění ve vizuálním rozhraní
# Argumenty:
# - expand=True: Graf se bude roztahovat, aby vyplnil veškerý dostupný prostor
# - fill=tk.BOTH: Graf se bude roztahovat jak horizontálně, tak vertikálně
fig_canvas.get_tk_widget().pack(expand=True, fill=tk.BOTH)

# Vytvoření navigační lišty pro interakci s grafem
fig_toolbar = NavigationToolbar2Tk(fig_canvas, root, pack_toolbar=False)
# Zobrazení navigační lišty v okně Tkinteru
# Argument fill=tk.X znamená, že navigační lišta bude vodorovně vyplněna dostupným prostorem
# tj. bude zabírat celou šířku okna
fig_toolbar.pack(fill=tk.X)

# Vytvoření canvasu pro zobrazení barevného vzorku pixelu
pixel_canvas = tk.Canvas(root, width=100, height=50, background="white")
pixel_canvas.pack() # Zobrazení canvasu v okně Tkinteru

# Vytvoření popisku pro zobrazení hodnot RGB a HLS pixelu
pixel_label = tk.Label(root, text="RGB: ---\nHLS: ---")
pixel_label.pack() # Zobrazení popisku v okně Tkinteru

# Vytvoření tlačítka pro spuštění akce "do stuff"
doit_button = tk.Button(root, text="do stuff")
doit_button.pack() # Zobrazení tlačítka v okně Tkinteru

# Funkce pro výběr barvy pixelu po kliknutí
def pick_color(event):
      if event.button != 1 or event.xdata is None:
            return
      x, y = int(event.xdata), int(event.ydata)
      # Získání hodnot RGB z pixelu v zobrazeném obrázku
      rgb = image[y, x]
      # Konverze na HLS
      hls = cv2.cvtColor(image[y : y + 1, x : x + 1], cv2.COLOR_RGB2HLS)[0, 0]
      # Konverze hodnot RGB na hexadecimální řetězec
      hex_rgb = "#%02X%02X%02X" % tuple(rgb)
      # Konverze hodnot HLS na hexadecimální řetězec
hex_hls = "#%02X%02X%02X" % tuple(hls)
      # Nastavení barvy canvasu na barvu pixelu
pixel_canvas.config(background=hex_rgb)
      # Nastavení textu popisku na hodnoty RGB a HLS
pixel_label.config(text=f"RGB: {hex_rgb}\nHLS: {hex_hls}")

# Funkce pro provedení akce "do stuff"
def do_stuff():
      print("hello")

# Připojení události kliknutí na obrázek k funkci pro výběr barvy pixelu
fig_canvas.mpl_connect("button_press_event", pick_color)
# Připojení události pohybu myší nad obrázkem k funkci pro výběr barvy pixelu
fig_canvas.mpl_connect("motion_notify_event", pick_color)
# Nastavení akce tlačítka "do stuff" na funkci "do_stuff"
doit_button.config(command=do_stuff)

# Spuštění hlavní smyčky Tkinteru pro zobrazení okna
root.mainloop()
 <--- KONEC FUNKCE MAIN ---> 

if __name__ == "__main__":
      main()

 

SHRNUTÍ POSTUPU PRO PŘIPOJENÍ TKINTERU DO MATLABLIB

Pro použití Tkinteru s Matplotlibem a propojení grafického uživatelského rozhraní Tkinter s vizualizací Matplotlib je potřeba splnit několik základních požadavků:

  1. Importování potřebných knihoven: Importujeme knihovny Tkinter a Matplotlib.
    import tkinter as tk
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk

  2. Vytvoření okna Tkinteru: Vytvoříme okno, do kterého budeme umisťovat grafy a další prvky uživatelského rozhraní.
    root = tk.Tk()
  3. Vytvoření instance Matplotlibu pro zobrazení grafu: Vytvoříme graf, který chceme zobrazit v aplikaci.
fig, ax = plt.subplots()
ax.plot(x, y)
 
  1. Propojení Matplotlibu s Tkinterem pomocí FigureCanvasTkAgg: Tímto krokem vytvoříme "plátno" pro zobrazení grafu v okně Tkinteru.
fig_canvas = FigureCanvasTkAgg(fig, root)
čili: 
     # Prop. pomocí instance FigureCanvasTkAgg
 fig_canvas = FigureCanvasTkAgg(fig, root)
     # Zobrazení plátna v okně Tkinteru
  fig_canvas.get_tk_widget().pack(expand=True, fill=tk.BOTH)
  1. Získání widgetu Tkinteru pro zobrazení grafu: Získání widgetu, který obsahuje zobrazený graf a umístění tohoto widgetu ve vizuálním rozhraní.
fig_widget = fig_canvas.get_tk_widget()
fig_widget.pack(expand=True, fill=tk.BOTH)
  1. Vytvoření navigační lišty Matplotlibu (Toolbar): Tato lišta poskytuje uživateli možnost interakce s grafem (např. přiblížení, vybírání oblastí atd.).
fig_toolbar = NavigationToolbar2Tk(fig_canvas, root, pack_toolbar=False)
  1. Zobrazení navigační lišty v okně Tkinteru: Vložení navigační lišty do okna Tkinteru.
fig_toolbar.pack(fill=tk.X)
  1. Vytvoření dalších prvků uživatelského rozhraní: Vytvoření dalších prvků, jako jsou tlačítka, popisky, vstupní pole atd.
pixel_canvas = tk.Canvas(root, width=100, height=50, background="white")
pixel_canvas.pack()

Tímto způsobem vytvoříme aplikaci, která zobrazuje Matplotlib grafy v okně Tkinteru a umožňuje uživatelům interakci s nimi.

CO ZNAMENÁ PROPOJIT INSTANCI FIGURE S INSTANCÍ TK CANVAS

Konkrétně tento řádek provádí následující:

  1. Vytvoření instance FigureCanvasTkAgg: Tento krok vytváří novou instanci třídy FigureCanvasTkAgg, která je zodpovědná za propojení Matplotlib grafu s Tkinterem. Tato instance je inicializována s argumenty fig (Matplotlib figura, která obsahuje všechny vizuální prvky) a root (Tkinterovské okno, do kterého budeme umisťovat graf).

  2. Propojení s Tkinterem:

    Po vytvoření instance FigureCanvasTkAgg je graf automaticky propojen s Tkinterem. To znamená, že všechny změny provedené v grafu pomocí Matplotlibu budou automaticky aktualizovány v Tkinteru a naopak.

  3. Umožnění zobrazení grafu v okně Tkinteru:

    Instance FigureCanvasTkAgg obsahuje widget Tkinteru, který můžeme získat pomocí metody get_tk_widget(). Tento widget je poté zobrazen v okně Tkinteru pomocí metody pack() nebo jiné metody pro umístění widgetu v okně Tkinteru.

Komentáře

Oblíbené příspěvky