Im vorherigen Artikel habe ich ** Tkinter-Vorlage ** eingeführt. In diesem Artikel werde ich vorstellen, wie eine Image Viewer-Anwendung basierend auf dieser Vorlage erstellt wird.
Windows 10 64 bit Python 3.7 IDE : Pycharm
Die folgende Abbildung zeigt ein Lochbild der diesmal erstellten Image Viewer-Anwendung. .. Die einzige Funktion dieser Anwendung besteht darin, eine Bilddatei auszuwählen und dieses Bild anzuzeigen. Fügen Sie dann die Funktion zum Ausschalten des Bildschirms und die Funktion zum Schließen der Anwendung hinzu.
`Die Person auf dem Bild ist Professor Ralph, eine Autorität für amerikanische Immunologie. ``
Die folgende Abbildung zeigt das Layout des Image Viewers.
Bereiten Sie das Widget ** vor, das Teil der Anwendung ist.
Verwenden Sie die Rastermethode, um jedes Widget zu platzieren.
** Dies ist der Programmcode der Vorlage, die in Tkinter Templated Article eingeführt wurde.
Vorlagenkonfiguration
In dieser Vorlage ** stellen Sie den Code zusammen, indem Sie das im vorherigen Kapitel beschriebene Widget festlegen und anordnen und die Funktion "Ereignisrückruf" ausfüllen. ** (Rahmen → Fleisch)
import tkinter as tk
from tkinter import ttk
class Application(tk.Frame):
def __init__(self,master):
super().__init__(master)
self.pack()
self.master.geometry("300x300")
self.master.title("Tkinter with Class Template")
self.create_widgets()
def create_widgets(self):
pass
def callBack(self):
pass
def main():
root = tk.Tk()
app = Application(master=root)#Inherit
app.mainloop()
if __name__ == "__main__":
main()
Legen Sie das Canvas-Widget fest und platzieren Sie es im Methodenteil create_widgets der Klassenanwendung. Verwenden Sie die Rastermethode für die Platzierung.
def create_widgets(self):
#Canvas
self.canvas1 = tk.Canvas(self)
self.canvas1.configure(width=640, height=480, bg='orange')
self.canvas1.create_rectangle(0,0,120, 70, fill='green')
self.canvas1.grid(column=1, row=0)
self.canvas1.grid(padx=20, pady=20)
3.2.File Open -> Image Load Dies ist der Teil, der die Datei öffnet und die Bilddatei lädt. Definieren Sie nach dem Setzen der Schaltfläche das loadImage () der Event Callback-Funktion. Die if-Anweisung in LoadImage () wurde hinzugefügt, um das Seitenverhältnis des Bildes zu überprüfen und die Größe des Originalbilds an die Größe des Canvas anzupassen. Während der Konvertierung der Bilddatei wird dann der Teil der RGB-Konvertierung von openCV, der Konvertierung in PIL und der Konvertierung in imageTK fortgesetzt. Verwenden Sie abschließend "self.canvas1.create_image", um das Bild im Canvas-Widget anzuzeigen.
def create_widgets(self):
#File open and Load Image
self.button_open = ttk.Button(self.frame_button)
self.button_open.configure(text = 'Load Image')
self.button_open.grid(column=0, row=1)
self.button_open.configure(command=self.loadImage)
# Event Call Back
def loadImage(self):
self.filename = filedialog.askopenfilename()
self.image_bgr = cv2.imread(self.filename)
self.height, self.width = self.image_bgr.shape[:2]
if self.width > self.height:
self.new_size = (640,480)
else:
self.new_size = (480,480)
self.image_bgr_resize = cv2.resize(self.image_bgr, self.new_size, interpolation=cv2.INTER_AREA)
self.image_rgb = cv2.cvtColor( self.image_bgr_resize, cv2.COLOR_BGR2RGB ) #Da imread BGR ist, wird es in RGB konvertiert
self.image_PIL = Image.fromarray(self.image_rgb) #Konvertieren Sie vom RGB- in das PIL-Format
self.image_tk = ImageTk.PhotoImage(self.image_PIL) #In das ImageTk-Format konvertieren
self.canvas1.create_image(320,240, image=self.image_tk)
Die folgende Abbildung zeigt das Bild, das beim Öffnen der Datei aufgenommen wurde. Um diese Funktion zu verwenden, verwenden Sie filesialog.askopenfilename ()
.
Wenn der Ordnername jedoch japanische Zeichen (UTF-8) enthält, tritt ein Fehler auf. Stellen Sie diesmal bitte sicher, dass der Ordnername, in dem die Bilddateien gespeichert sind, in Englisch ist. (Wenn Sie wissen, wie Sie dieses Problem lösen können, hinterlassen Sie bitte eine Nachricht.)
Es ist eine Funktion zum Ausschalten des Bildschirms auf Leinwand. Verwenden Sie die Methode canvas.delete ().
def clearImage(self):
self.canvas1.delete("all")
Beim Beenden wird die MessageBox angezeigt und das Urteil des Benutzers wird erneut als "Sind Sie sicher, dass Sie beenden möchten?" Bestätigt.
def quit_app(self):
self.Msgbox = tk.messagebox.askquestion("Exit Applictaion", "Are you sure?", icon="warning")
if self.Msgbox == "yes":
self.master.destroy()
else:
tk.messagebox.showinfo("Return", "you will now return to application screen")
Die folgende Abbildung zeigt den Bildschirm, wenn die MessageBox angezeigt wird.
Die folgende Abbildung zeigt das Ausführungsergebnis. Es wurde bestätigt, dass es wie geplant funktioniert. Es wurde bestätigt, dass Clear Image und Quit ebenfalls in Ordnung sind.
import tkinter as tk
from tkinter import ttk
import sys
import os
from tkinter import *
from tkinter import messagebox,filedialog
import numpy as np
from PIL import Image, ImageTk
import cv2
# coding: utf-8
#Ich konnte keine japanischen Zeichen in den Ordnernamen einfügen.
class Application(tk.Frame):
def __init__(self,master):
super().__init__(master)
self.pack()
self.master.geometry("800x600")
self.master.title("Tkinter with Class Template")
self.create_widgets()
def create_widgets(self):
#Canvas
self.canvas1 = tk.Canvas(self)
self.canvas1.configure(width=640, height=480, bg='orange')
self.canvas1.create_rectangle(0,0,120, 70, fill='green')
self.canvas1.grid(column=1, row=0)
self.canvas1.grid(padx=20, pady=20)
#Frame
self.frame_button = ttk.LabelFrame(self)
self.frame_button.configure(text=' Button Frame ')
self.frame_button.grid(column=1,row=1)
self.frame_button.grid(padx=20, pady=20)
#File open and Load Image
self.button_open = ttk.Button(self.frame_button)
self.button_open.configure(text = 'Load Image')
self.button_open.grid(column=0, row=1)
self.button_open.configure(command=self.loadImage)
# Clear Button
self.button_clear = ttk.Button( self.frame_button )
self.button_clear.configure( text='Clear Image' )
self.button_clear.grid( column=1, row=1 )
self.button_clear.configure(command=self.clearImage)
# Quit Button
self.button_quit = ttk.Button( self.frame_button )
self.button_quit.config( text='Quit' )
self.button_quit.grid( column=2, row=1 )
self.button_quit.configure(command = self.quit_app)
# Event Call Back
def loadImage(self):
#self.folder_name = filedialog.askdirectory()
self.filename = filedialog.askopenfilename()
#print(self.folder_name)
print(self.filename)
self.image_bgr = cv2.imread(self.filename)
self.height, self.width = self.image_bgr.shape[:2]
print(self.height, self.width)
if self.width > self.height:
self.new_size = (640,480)
else:
self.new_size = (480,480)
self.image_bgr_resize = cv2.resize(self.image_bgr, self.new_size, interpolation=cv2.INTER_AREA)
self.image_rgb = cv2.cvtColor( self.image_bgr_resize, cv2.COLOR_BGR2RGB ) #Da imread BGR ist, wird es in RGB konvertiert
# self.image_rgb = cv2.cvtColor(self.image_bgr, cv2.COLOR_BGR2RGB) #Da imread BGR ist, wird es in RGB konvertiert
self.image_PIL = Image.fromarray(self.image_rgb) #Konvertieren Sie vom RGB- in das PIL-Format
self.image_tk = ImageTk.PhotoImage(self.image_PIL) #In das ImageTk-Format konvertieren
self.canvas1.create_image(320,240, image=self.image_tk)
def clearImage(self):
self.canvas1.delete("all")
def quit_app(self):
self.Msgbox = tk.messagebox.askquestion("Exit Applictaion", "Are you sure?", icon="warning")
if self.Msgbox == "yes":
self.master.destroy()
else:
tk.messagebox.showinfo("Return", "you will now return to application screen")
def main():
root = tk.Tk()
app = Application(master=root)#Inherit
app.mainloop()
if __name__ == "__main__":
main()
Recommended Posts