tkinterをやってみよう

pythonにいくつかあるGUIライブラリの中で一番手軽に扱えそうなtkinterをいじってみた。本当はkivyとかやりたかったがうまくインストールできなかった、、、


雛形

root = tkinter.Tk()
root.mainloop()

ボタンやラベルなど一通りのものは貼れる。
イベントを登録するにはbind()を使う。例えばボタンに登録するには

button.bind("<1>",method)

methodが実行されてほしい関数。<1>は左クリックが押された時にという意味で、他にも<2>だと右クリックで実行されたりとバリエーションがある。注意点としてmethodの引数にeventを指定する。buttonの定義時にcommandで指定するやり方もあるらしいがbindの方が拡張性が高い?


canvasを登録すれば図形描画もできる。

canvas = tkinter.Canvas(self,bg="white", height=750, width=500)
canvas.create_line(100, 100, 200, 200, fill='blue') #線
canvas.create_polygon(150, 150, 500, 20, 200, 40, fill="red") #多角形
canvas.pack()

f:id:busongames:20180818172216p:plain

模索して作ったサンプルファイル

import tkinter
from tkinter import filedialog as tkFileDialog
from PIL import Image, ImageTk

class Application(tkinter.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.button1 = tkinter.Button(self,text="select")
        self.button1.pack()
        self.button1.bind("<1>",self.photoselect)
        self.leftC = tkinter.Canvas(self,bg="white", height=750, width=500)
        self.leftC.pack(side="left")
        self.rightC = tkinter.Canvas(self,bg="white", height=750, width=500)
        self.rightC.create_line(100, 100, 200, 200, fill='blue')
        self.rightC.create_polygon(150, 150, 500, 20, 200, 40, fill="red")
        self.rightC.pack(side="right")

    def photoselect(self,event):
        filename=tkFileDialog.askopenfilename()
        self.img = Image.open(filename)  
        self.image = self.photoresize(self.img)
        self.img = ImageTk.PhotoImage(self.image)
        self.leftC.create_image( 0, 0, image = self.img, anchor = tkinter.NW )

     #画像の縦横比で縮尺のサイズを変える
    def photoresize(self,img):
        w,h=img.size
        if w/h>=500/750:
            return img.resize((500,int(h*500/w)))
        else:
            return img.resize((int(h*750/h),750))


if __name__ == "__main__":
    root = tkinter.Tk()
    root.geometry("1000x800")
    app = Application(master=root)
    app.mainloop()

間違いございましたらお願いします。