LoginSignup
72
108

More than 3 years have passed since last update.

pythonで極力簡単にGUIを作る【tkinter編】

Last updated at Posted at 2020-09-13

pythonならデフォルトで入っているtkinterを使ってUIを作る
操作画面上での行動を受け取って処理につなげる
深層学習のハイパーパラメータを選択式にして詳しくない人でも弄れるようにできたりしたい

一番シンプルなコード:ウインドウの立ち上げ

import tkinter

root = tkinter.Tk()
root.title("たいとる")
root.resizable(False, False)
root.geometry("400x200")


#ここに付け足していく

root.mainloop()

以上でウインドウが立ち上がる

resizableでサイズ変更の可不可を操作
geometryで描画サイズを調整
mainloopでrootに設定した内容を実行する

これを基礎としてガチャガチャ付け足していく

キャプチャ.PNG

文字の配置


label = tkinter.Label(root, text="ラベル", font=("System",24))
label.place(x=200, y=100)

aaa.PNG

チェックボタンの配置とチェックされているかを確認する

import tkinter


def check():
    if cval.get() == True:
        print("yes")
    else:
        print("no")


root = tkinter.Tk()
root.geometry("400x200")


cval = tkinter.BooleanVar()
cval.set(False)

cbtn = tkinter.Checkbutton(text="ボタン", variabl=cval, command = check)
cbtn.pack()


root.mainloop()

BooleanVarで最初はチェック無しの状態に設定しておく
get()でチェックされているか調べる事ができる。
ボタンが押されたときに任意の関数を動かしたいならばcommandで関数を指定する

このコードだとコマンドライン上、もしくはnotebook上でチェックするたびにyesとnoが返ってくる

dasa.PNG

押しボタンの配置と押したとき反応する関数の定義

import tkinter
import tkinter.font

def click_btn():
    button["text"] = "クリックしたで"

root = tkinter.Tk()
root.title("title")
root.geometry("400x200")


button = tkinter.Button(root, text="ボタン", font=("Times New Roman", 24), command=click_btn)
button.place(x=100,y=100)

root.mainloop()

ffff.PNG

Buttonで押しボタンの配置
button内のtext引数へ値を入れる関数を定義しておく
fontも指定できる

指定できるフォントを確認したければ以下

import tkinter.font

root = tkinter.Tk()
tkinter.font.families()

ddsss.PNG

ボタンを押すと表示される文字が変化する

import tkinter
import random

def click_btn():
    label["text"] = random.choice(["おはよう","こんにちは","こんばんは"])
    label.update()

root = tkinter.Tk()
root.title("title")
root.geometry("400x200")
root.resizable(False, False)

label = tkinter.Label(root, text="押すとここに表示", font=("Times New Roman", 15), bg = "white")
label.place(x=10, y=10)

button = tkinter.Button(root, text="押しボタン", font=("Times New Roman", 15),command = click_btn, fg = "skyblue")
button.place(x = 50, y = 50)

root.mainloop()

labelの中に「押すとここに表示」が入っている。
ボタンを押すことでtext引数をアップデートする関数を実行したいのでcommandに指定して実行してもらう

5452.PNG

ボタンを押すとメッセージボックスが出る

import tkinter
import tkinter.messagebox

def click_btn():
    tkinter.messagebox.showinfo("別窓のたいとる", "表示内容")

root = tkinter.Tk()
root.title("たいとる")
root.resizable(False, False)
root.geometry("400x200")

button = tkinter.Button(root, text="ボタン", font=("Times New Roman", 24), command=click_btn)
button.place(x=100,y=100)

root.mainloop()

hhhh.PNG

手入力枠の設置と、手入力内容をgetで取得する

import tkinter

def click_btn():
    txt = entry.get()
    button["text"] = txt

root = tkinter.Tk()
root.resizable(False, False)
root.geometry("400x200")


entry = tkinter.Entry(width=20)
entry.place(x=20,y=20)

button = tkinter.Button(root, text="書いた内容をボタンの名前として吸い取るで", font=("Times New Roman", 15),command = click_btn)
button.place(x = 20, y = 100)

root.mainloop()

fffddg.PNG

入力枠はEntryで設置できる
複数行は別の関数がある
Entryに入力された内容はget関数で取得できるので、取得した後にボタンの表示に反映する

画像描画エリアを作り、画像を表示する

import tkinter
import tkinter.font
from PIL import ImageTk, Image

root = tkinter.Tk()
root.title("title")
root.geometry("600x500")


image = Image.open("アヴォカド.png")

canvas = tkinter.Canvas(root, width=500, height=400, bg="black")
canvas.pack()

photo = ImageTk.PhotoImage(image, master=root)
canvas.create_image(100, 100, image=photo)

root.mainloop()

ウインドウの中心から指定したサイズの描画エリアをつくる
描画エリアの左上を0,0として、create_imageの位置を指定する
画像の中心が指定される

cavas.PNG

複数の描画エリアに分けてmatplotを表示する

matplotからFigureCanvasTkAggを使ってtkinterに描画する
順番に表示される

20201120追記-描画データの準備

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()

df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris['target']
import tkinter as tk
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

root= tk.Tk() 
root.geometry("1500x500")

figure1 = plt.Figure(figsize=(5,5), dpi=100)
ax1 = figure1.add_subplot(1,1,1)
bar1 = FigureCanvasTkAgg(figure1, root)
bar1.get_tk_widget().pack(side=tk.LEFT, fill=tk.BOTH)
df1 = df.groupby('target').sum()
df1.plot(kind='bar', legend=True, ax=ax1)
ax1.set_xticklabels(labels=df1.index,rotation=45)
ax1.set_title('fig1 title')

figure2 = plt.Figure(figsize=(5,5), dpi=100)
ax2 = figure2.add_subplot(1,1,1)
line2 = FigureCanvasTkAgg(figure2, root)
line2.get_tk_widget().pack(side=tk.LEFT, fill=tk.BOTH)
df2 = df.groupby('target').sum()
df2.plot(kind='line', legend=True, ax=ax2, color='r',marker='o', fontsize=10)
ax2.set_title('fig2 title')

figure3 = plt.Figure(figsize=(5,5), dpi=100)
ax3 = figure3.add_subplot(1,1,1)
ax3.scatter(df['sepal length (cm)'],df['petal length (cm)'], color = 'g')
scatter3 = FigureCanvasTkAgg(figure3, root) 
scatter3.get_tk_widget().pack(side=tk.LEFT, fill=tk.BOTH)
ax3.set_ylabel('xlab')
ax3.set_xlabel('xlab')
ax3.set_title('fig3 title')

root.mainloop()

image.png

表示させた画像をキーボード操作から動かす

キーボード操作を受け取るにはKeyPress等を使用する
キーボード操作の内容もついでに取得してみる

動かしたい画像にtagを付けて画像位置を指定する
after関数は1000=1秒の遅れを使いつつ後ろに指定した関数を反映する

import tkinter
from PIL import ImageTk, Image

key = ""

def key_down(e):
    global key
    key = e.keysym
    label["text"] = ("your key log = "+ key)

def key_up(e):
    global key
    key = ""

cx = 400
cy = 300

def main_proc():
    global cx, cy
    if key == "Up":
        cy = cy -20
    if key == "Down":
        cy = cy + 20
    if key == "Left":
        cx = cx - 20
    if key =="Right":
        cx = cx + 20
    canvas.coords("MYpicture", cx,cy)
    root.after(100, main_proc)

log=""

def puss(e):
    global log
    log = e.keysym



root = tkinter.Tk()

root.bind("<KeyPress>", key_down)
root.bind("<KeyRelease>", key_up)

canvas = tkinter.Canvas(width=800, height=600,bg="lightgreen")
canvas.pack()

image = Image.open("アヴォカド.png")
photo = ImageTk.PhotoImage(image, master=root)
canvas.create_image(cx, cy, image=photo, tag="MYpicture")

label = tkinter.Label(font=("System",24))
label.pack()

main_proc()

root.mainloop()

des.gif

マウス位置を取得するコード

import tkinter

mouse_x = 0
mouse_y = 0
mouse_c = 0

def mouse_move(e):
    global mouse_x, mouse_y
    mouse_x = e.x
    mouse_y = e.y

def mouse_press(e):
    global mouse_c
    mouse_c = 1

def mouse_release(e):
    global mouse_c
    mouse_c = 0

def game_main():
    fnt = ("Times New Roman", 30)
    txt = "mouse({},{}){}".format(mouse_x, mouse_y, mouse_c)
    cvs.delete("TEST")
    cvs.create_text(456, 384, text=txt, fill="black", font=fnt, tag="TEST")
    root.after(100, game_main)

root = tkinter.Tk()
root.title("マウス入力")
root.resizable(False, False)
root.bind("<Motion>", mouse_move)
root.bind("<ButtonPress>", mouse_press)
root.bind("<ButtonRelease>", mouse_release)
cvs = tkinter.Canvas(root, width=912, height=768)
cvs.pack()
game_main()
root.mainloop()

deskk.gif

以上

buttonやentryと組み合わせれば入力内容を描画したり、commandを使えばパッケージ内の関数を引っ張ってくることができるようになったと思う

Pythonでつくる ゲーム開発

How to Place Matplotlib

72
108
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
108