73
109

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

73
109
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
73
109

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?