Tkinter CookBook~간이 이미지 뷰어~

Tkinter CookBook4



전제



1. 실행 환경



본 페이지에 기재되어 있는 프로그램 코드는 Windows10, python3.6에서 실행할 수 있는 것을 확인하고 있습니다.

2. 필요한 파이썬 모듈



아래의 모듈을 별도로 설치해야 합니다.
  • PIL

  • 3. 본 투고의 목적



    tkinter로 작은 부품을 점점 만들고 싶습니다.
    이번에는 이미지를 표시하는 GUI를 만듭니다.
    그냥 그냥!

    그럼 시작합시다.



    ImageViewer.py
    import tkinter as tk
    from PIL import Image, ImageTk
    
    class ImageViewer:
        def __init__(self, root):
            self.label = tk.Label(root)
            self.label.grid(column=0, columnspan=2, row=1)
    
            self.entry = tk.Entry(root)
            self.entry.grid(column=0, row=0)
            self.entry["font"] = ("Helvetica", 20)
    
            self.button = tk.Button(root)
            self.button.grid(column=1, row=0)
            self.button["width"] = 10
            self.button["text"] = "表示"
            self.button["font"] = ("Helvetica", 20)
            self.button["command"] = self.setImage
    
        def setImage(self, event=None):
            img = Image.open(self.entry.get())
            self.image = ImageTk.PhotoImage(img.resize((500,500)))
            self.label["image"] = self.image
            self.label.image = self.image
    
    if __name__=="__main__":
        root = tk.Tk()
        imageViewer = ImageViewer(root)
        root.mainloop()
    

    실행하면 아래와 같은 창이 시작됩니다.


    패스를 넣고 표시라고 적힌 버튼을 누르면,

    이미지를 표시합니다. (이것뿐입니다.)

    이 프로그램이하는 일은

  • Label, Entry, Button 객체 배치
  • 버튼을 누를 때 "엔트리"오브젝트에 입력 된 문자열을 가져 와서 해당 문자열에 나열된 경로의 이미지를 표시합니다.

    입니다.

    1. "Label", "Entry", "Button"객체 배치


    def __init__(self, root):
            self.label = tk.Label(root)
            self.label.grid(column=0, columnspan=2, row=1)
    
            self.entry = tk.Entry(root)
            self.entry.grid(column=0, row=0)
            self.entry["font"] = ("Helvetica", 20)
    
            self.button = tk.Button(root)
            self.button.grid(column=1, row=0)
            self.button["width"] = 10
            self.button["text"] = "表示"
            self.button["font"] = ("Helvetica", 20)
            self.button["command"] = self.setImage
    

    tk. 위젯 이름(부모 개체 이름)으로 각 개체(라벨, 버튼, 항목)를 만듭니다.

    "Button"은 command 속성에 self.setImage 메소드를 지정합니다. 버튼을 누르면 이 메소드가 불려 갑니다.

    또 「Label」오브젝트를 grid 메소드에 의해 배치할 때에 columnspan이라고 하는 인수를 지정하고 있습니다.

    위 그림과 같이 column=0에는 엔트리 오브젝트, column=1에는 버튼 오브젝트가 배치되어 있고, 그 아래에 이미지를 배치하고 싶습니다. 이 때 이미지는 column=0 및 1을 넘어야 합니다. 그 지정은 columnspan입니다.
    columnspan=2로 하는 것으로 2개의 column에 걸칠 수가 있습니다.

    2. 버튼을 눌렀을 때 "Entry"오브젝트에 입력된 문자열을 가져와 해당 문자열에 나열된 경로의 이미지를 표시합니다.


    def setImage(self, event=None):
        img = Image.open(self.entry.get())
        self.image = ImageTk.PhotoImage(img.resize((500,500)))
        self.label["image"] = self.image
        self.label.image = self.image
    

    단순히 이미지를 표시하면 PIL 모듈을 가져올 필요가 없습니다.
    PIL 모듈을 넣은 목적은 이미지의 크기 조정입니다. 표시하는 화상의 사이즈가 일정하면 좋을까라고 생각해, 그렇게 했습니다.

    먼저 PIL에서 이미지를 열려면 Image.open(이미지 경로)이라고 합니다.
    위의 코드는 self.entry.get()로 경로를 가져옵니다. get() 은 엔트리 객체 내에 입력된 문자열을 가져오는 메서드입니다.

    또한 PIL로 열린 이미지를 tkinter로 사용하려면 ImageTk.PhotoImage를 사용합니다. 위의 코드에서는 이미지의 크기를 조정하는 resize((x_size, y_size)) 메서드를 사용합니다.

    마지막으로 "Label"객체의 image 속성에 ImageTk.PhotoImage 객체를 지정합니다.

    tkinter의 PhotoImage 객체는 파이썬의 가비지 수집에 의해 지워집니다. 여기에서는 만약을 위해 self.label.image도 ImageTk.PhotoImage 객체를 참조하도록 하고 있습니다.
    "image"속성만으로 PhotoImage 객체를 참조하는 경우 이미지가 표시되지 않을 수 있습니다.
    h tp // 엣 f보 t. 오 rg / t Kinte r 보오 k / p 호토마게. htm

    이상입니다!



    기타 Tkinter Cookbook



    가계부 작성 중...
    글꼴
    타이머
  • 좋은 웹페이지 즐겨찾기