LoginSignup
19
20

More than 1 year has passed since last update.

Python3最新版対応 Tkinterのまとめ

Last updated at Posted at 2021-11-07

こんにちは

最近PythonでUIを作ってみようと思ったのですが、画面上にウィンドウなどを表示させるためのモジュールである"Tkinter"についてのネット情報が動作しないものが(バージョンやハードの関係で)一部あったりしたので、
私なりに最新版に対応している情報をまあまあ詳しくまとめてみました。
あと、私がつまずいた注意ポイントなども載せているので、参考になると幸いです。

動作環境

2023年3月5日現在

Mac Book Pro M1 Max

Mac OS Ventura 13.2.1

Visual Studio Code 1.76.0
Python 3.11.1

Tkinterの基本文

test.py
import sys
import tkinter

root = tkinter.Tk()
#他のコードはここに記載
root.mainloop()

実行するとこんな感じ。小さなTkというウィンドウが表示されます。
スクリーンショット 2021-10-31 21.17.04.png

ちなみに、pyファイルの名前をtkinter.pyにするとエラーが出ます。
tkinterを使うからといってtkinter.pyにするとえらい目に遭いましたww

(このようなエラー内容です。)

tkinter.py
AttributeError: partially initialized module 'tkinter' has no attribute 'Tk' (most likely due to a circular import)

ウィンドウタイトル

ウィンドウの上についていた文字を変えるには基本文に加えて、このようにかきます。

root.title("ウィンドウのタイトル")

実行するとこんな感じに、ウィンドウタイトルが変わっています。
スクリーンショット 2021-10-31 21.21.39.png

勿論、ダブルクォーテーション(")の中の文字を変えるとタイトルが変わります。

プログラム全文

window_title.py
import sys
import tkinter


root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.mainloop()

ウィンドウサイズ

ウィンドウのデフォルトサイズを変えるには、基本文に加えて、このようにかきます。

root.geometry("横x縦")

試しに500x700のウィンドウを作ると、このように縦に長いウィンドウができます。
スクリーンショット 2021-10-31 21.29.25.png

プログラム全文

window_size.py
import sys
import tkinter


root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x700")
root.mainloop()

タイトルバーを隠す

タイトルバーは、ウィンドウにあるこういうやつなんですけど、これをTkinterで隠す方法があるので紹介します。
スクリーンショット 2021-11-10 18.42.25.png
#他のコードはここに記載に次のように追加します。

root.overrideredirect(True)

実行結果。ダークモードは気にしないでいただきたい。
スクリーンショット 2021-11-10 18.41.55.png

最大化の無効化

最大化の無効化は意外と役に立ちます。
タイトルバーを無効化するのと同じところに、このように記載します。

root.resizable(0, 0)

実行結果。最大化が押せなくなっています。
スクリーンショット 2021-11-10 18.47.23.png

#Tkinterの要素
ここからがメインです。Tkinterでは主にGUIを作るための要素が用意されています。

##ラベル
ラベルとは、普通でいうテキストのことです。
文字をウィンドウ上に表示します。
ちなみにプログラムは基本文の「#他のコードはここに記載」の下に追加していきます。(上でもよい)

label = tkinter.Label(text='ラベルの文字')
label.pack()

実行するとこんな感じ。
スクリーンショット 2021-11-01 16.22.27.png

プログラム全文

tk_label.py
import sys
import tkinter


root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

label = tkinter.Label(text='ラベルの文字')
label.pack()

root.mainloop()

文字を変えるにはシングルクォーテーションの中を書き換えます。
label = tkinter.Label(text='ラベルの文字')labelは変数なので別の文字列も指定できます。(他のところlabel.pack()なども適用する必要あり。)
また、label.packでは位置を自動的に合わせてくれるという感じです。

文字の装飾

文字色を変えたり、文字サイズを変えたりするには、基本的にlabel = tkinter.Label(text='ラベルの文字')のカッコの中にコンマで区切って付け足していきます。

文字色

背景色は先述したところにforeground='#ff0000'を付け足します。
(下のサンプルはその行を丸ごと置き換えています。)

label = tkinter.Label(text='ラベルの文字', foreground='#ff0000')

#ff0000の部分はHTMLカラーコードを使って、設定できます。
原色大辞典 - HTMLカラーコード

実行結果
スクリーンショット 2021-11-01 16.36.39.png
プログラム全文

label_color.py
import sys
import tkinter


root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

label = tkinter.Label(text='ラベルの文字', foreground='#ff0000')
label.pack()

root.mainloop()

文字の背景色

文字の背景色も文字色と同じところにコンマで区切って、background='HTMLカラーコード'を付け足します。

label = tkinter.Label(text='ラベルの文字', background='#ffff00')

実行結果
スクリーンショット 2021-11-01 16.50.20.png
プログラム全文

label_color_background.py
import sys
import tkinter


root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

label = tkinter.Label(text='ラベルの文字', background='#ffff00')
label.pack()

root.mainloop()

フォント、文字サイズ、太さ

フォント、文字サイズ、太さを設定する場合は同じようにコンマ区切りでfont=("フォント", "文字サイズ", "太さ")のようにします。

注意
カッコやダブルクォーテーションを忘れないように注意してください。

label = tkinter.Label(text='ラベルの文字', background='#ffff00', font=("MSゴシック", "20", "bold"))

実行結果
スクリーンショット 2021-11-01 17.02.29.png

プログラム全文

label_font.py
import sys
import tkinter


root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

label = tkinter.Label(text='ラベルの文字', background='#ffff00', font=("MSゴシック", "20", "bold"))
label.pack()

root.mainloop()

##文字の位置
文字の位置はlabel.pack()を潰して、このように記載します。

label.place(x=150, y=200)

実行結果。このように移動しているのがわかります。
スクリーンショット 2021-11-01 17.18.33.png
プログラム全文

label_place.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

label = tkinter.Label(text='ラベルの文字')
label.place(x=150, y=200)

root.mainloop()

label.place(x=x座標, y=y座標)という感じで、位置を変えれます。

placeは他のTkinter要素でも使えるので、覚えておくといいです。

ボタン

ボタンはアプリケーションでもよく使われる要素の一つです。
Tkinterではbutton = tkinter.Button(text='ボタン')でボタンを作ることができます。
勿論、.pack()はボタンでも機能します。

Button = tkinter.Button(text='ボタン')
Button.pack()

実行結果
スクリーンショット 2021-11-01 17.28.00.png
プログラム全文

tk_button.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

button = tkinter.Button(text='ボタン')
button.pack()

root.mainloop()

基本的なことはラベルと同じです。
button = tkinter.Button(text='ボタン')のシングルクォーテーション内の文字列を変えることでボタンの文字列も変わります。
また、placeもボタンではラベルと同じように、文の最初の変数名を変えるだけで機能するので、説明は省略します。
一応実行画面
スクリーンショット 2021-11-01 17.36.40.png
プログラム全体

button_place.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

button = tkinter.Button(text='ボタン')
button.place(x=150, y=200)

root.mainloop()

その他のオプション

文字色

ラベルと同じようにカッコ内にコンマ区切りでforeground="HTMLカラーコード"を追加します。
スクリーンショット 2021-11-01 17.40.29.png
プログラム全文

button_color.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

button = tkinter.Button(text='ボタン', foreground="#ff0000")
button.place(x=150, y=200)

root.mainloop()

ボタンの長さ

文字色と同じところにwidth=長さを追加します。
スクリーンショット 2021-11-01 17.53.44.png
プログラム全文

button_width.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

button = tkinter.Button(text='ボタン', width=100)
button.pack()

root.mainloop()

ボタンが押されたときの処理

実行結果
スクリーンショット 2021-11-02 18.20.08.png
プログラム全文

button_event.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

def click(event):
    print("Hello")

button = tkinter.Button(text='ボタン', width=100)
button.pack()
button.bind("<Button-1>",click) 

root.mainloop()

処理はdefを用いて新しく関数を作ります。
button.bind("<Button-1>",関数名)で処理を関数に飛ばしてる感じです。
<Button-1>は左クリックという意味です。
<Button-2>に変えると右クリックで反応するようになります。

入力ボックス

入力ボックスはEntryを使います。
新しく変数を指定します。

boxa = tkinter.Entry()
boxa.pack()

実行結果
スクリーンショット 2021-11-03 16.40.35.png
画面が黒いのはダークモードになってるからです。

プログラム全文

textbox.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

boxa = tkinter.Entry()
boxa.pack()

root.mainloop()

オプション

入力ボックスの長さ

Entry() のカッコ内にwidth=長さを入れます。

boxa = tkinter.Entry(width=100)

実行結果
スクリーンショット 2021-11-03 17.03.32.png
プログラム全文

textbox_width.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

boxa = tkinter.Entry(width=100)
boxa.pack()

root.mainloop()

入力された内容を取得

Entryに入力された情報を変数に入れて、取得することができます。
取得する変数 = 取得するEntryの名前.get()を追加します。
先ほどのサンプルコードに当てはめるとこんな感じです。

input_ = boxa.get()

プログラム全文

box_get.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

boxa = tkinter.Entry(width=100)
boxa.pack()

input_ = boxa.get()

root.mainloop()

取得した内容をprint(input_)などで出力してみると確認することができます。

入力ボックスの中身を削除する

普通にやるとわかりづらいので、先ほどのボタンを活用して、ボタンを押すと中身が消えるという感じにしていきます。
新規にボタンと関数を作り、関数内にboxa.delete(0, tkinter.END)を追加します。

実行結果。写真なので伝わらないかもですが、ボタンを押すと入力した文字が消えます。
スクリーンショット 2021-11-03 18.21.39.png

プログラム全文

box_del.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

def click(event):
    boxa.delete(0, tkinter.END)

boxa = tkinter.Entry(width=100)
boxa.pack()

button = tkinter.Button(text="削除")
button.pack()
button.bind("<Button-1>",click) 

root.mainloop()

デフォルトで文字を入力しておく方法

先に実行結果
スクリーンショット 2021-11-03 18.27.03.png

プログラム全文

textbox_insert.py
import sys
import tkinter

root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")

def click(event):
    boxa.delete(0, tkinter.END)

boxa = tkinter.Entry(width=100)
boxa.insert(tkinter.END,"事前に入力しておく文字列")
boxa.pack()

root.mainloop()

終わりに

今回はTkinterについてまとめました。
質問などあれば、コメントに書いていただければ、出来る範囲で回答しようと思っているのでよろしくお願いしま

19
20
2

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
19
20