こんにちは
最近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の基本文
import sys
import tkinter
root = tkinter.Tk()
#他のコードはここに記載
root.mainloop()
実行するとこんな感じ。小さなTkというウィンドウが表示されます。
ちなみに、pyファイルの名前をtkinter.pyにするとエラーが出ます。
tkinterを使うからといってtkinter.pyにするとえらい目に遭いましたww
(このようなエラー内容です。)
AttributeError: partially initialized module 'tkinter' has no attribute 'Tk' (most likely due to a circular import)
ウィンドウタイトル
ウィンドウの上についていた文字を変えるには基本文に加えて、このようにかきます。
root.title("ウィンドウのタイトル")
実行するとこんな感じに、ウィンドウタイトルが変わっています。
勿論、ダブルクォーテーション(")の中の文字を変えるとタイトルが変わります。
プログラム全文
import sys
import tkinter
root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.mainloop()
ウィンドウサイズ
ウィンドウのデフォルトサイズを変えるには、基本文に加えて、このようにかきます。
root.geometry("横x縦")
試しに500x700のウィンドウを作ると、このように縦に長いウィンドウができます。
プログラム全文
import sys
import tkinter
root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x700")
root.mainloop()
タイトルバーを隠す
タイトルバーは、ウィンドウにあるこういうやつなんですけど、これをTkinterで隠す方法があるので紹介します。
#他のコードはここに記載
に次のように追加します。
root.overrideredirect(True)
最大化の無効化
最大化の無効化は意外と役に立ちます。
タイトルバーを無効化するのと同じところに、このように記載します。
root.resizable(0, 0)
#Tkinterの要素
ここからがメインです。Tkinterでは主にGUIを作るための要素が用意されています。
##ラベル
ラベルとは、普通でいうテキストのことです。
文字をウィンドウ上に表示します。
ちなみにプログラムは基本文の「#他のコードはここに記載」の下に追加していきます。(上でもよい)
label = tkinter.Label(text='ラベルの文字')
label.pack()
プログラム全文
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カラーコード
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')
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"))
プログラム全文
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)
実行結果。このように移動しているのがわかります。
プログラム全文
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()
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もボタンではラベルと同じように、文の最初の変数名を変えるだけで機能するので、説明は省略します。
一応実行画面
プログラム全体
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カラーコード"
を追加します。
プログラム全文
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=長さ
を追加します。
プログラム全文
import sys
import tkinter
root = tkinter.Tk()
root.title("ウィンドウのタイトル")
root.geometry("500x400")
button = tkinter.Button(text='ボタン', width=100)
button.pack()
root.mainloop()
ボタンが押されたときの処理
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()
プログラム全文
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)
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()
プログラム全文
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)
を追加します。
実行結果。写真なので伝わらないかもですが、ボタンを押すと入力した文字が消えます。
プログラム全文
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()
デフォルトで文字を入力しておく方法
プログラム全文
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についてまとめました。
質問などあれば、コメントに書いていただければ、出来る範囲で回答しようと思っているのでよろしくお願いしま