あえてWEBではなくデスクトップに手を出した私。
本意ではなく会社の必然によるものでしたが、pythonデスクトップアプリでいろいろ開発してきました。
その反面、数々の失敗をしました。
chatgpt様様な私ですが、「全然コードが動かない」「開発がうまく行かない」
と悩んだ日々です、、
tkinterを使う人はとても少ないと思いますが、もし使っている方がいたら参考にしてください!
1. mainloop()の呼び出し忘れ
mainloop()を呼び出さないとウィンドウが表示されません
→ Tkinterアプリケーションはmainloop()を呼び出してイベントループを開始する必要があります。これを忘れると、GUIウィンドウが一瞬表示された後、すぐに終了してしまいます
python
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()
# root.mainloop() を忘れる
💗修正方法 : スクリプトの最後で必ずroot.mainloop()を呼び出します
python
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()
root.mainloop() # イベントループを開始
2. ウィジェットのサイズと親要素のサイズの混同
ウィジェットのサイズを設定したつもりでも、親要素のサイズが優先されることがある
→pack()やgrid()を使用すると、親要素のサイズは子ウィジェットのサイズに基づいて自動調整されます。pack_propagate(False)を使って自動調整を無効にする必要があります
python
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root, width=300, height=200)
frame.pack() # サイズが適用されない
root.mainloop()
💗修正方法 : 自動調整を無効にする設定を追加します
python
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root, width=300, height=200)
frame.pack_propagate(False) # サイズの自動調整を無効化
frame.pack()
root.mainloop()
3. イベント関数に引数を渡す際の誤り
イベントハンドラー関数に引数を渡したい場合、間違えて括弧付きで直接呼び出してしまう
→command引数で括弧を付けると、その場で関数が実行され、ボタンを押したときには何も動作しません
python
import tkinter as tk
def on_click(msg):
print(msg)
root = tk.Tk()
button = tk.Button(root, text="Click Me", command=on_click("Button clicked")) # 実行される
button.pack()
root.mainloop()
💗修正方法 : lambdaを使って関数に引数を渡します
python
import tkinter as tk
def on_click(msg):
print(msg)
root = tk.Tk()
button = tk.Button(root, text="Click Me", command=lambda: on_click("Button clicked")) # 正しい
button.pack()
root.mainloop()
4. ウィジェットの削除方法の間違い
ウィジェットを削除するつもりで単に非表示にするコードを書いてしまう
→ pack_forget()やgrid_remove()はウィジェットを非表示にするだけで、削除するわけではありません
python
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()
label.pack_forget() # 非表示にするが削除はされていない
root.mainloop()
💗修正方法 : ウィジェットを完全に削除するにはdestroy()を使用します
python
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()
label.destroy() # ウィジェットを削除
root.mainloop()
5. 文字列が変更されないLabelウィジェット
Labelのテキストを直接変更しようとして効果がない
→ ウィジェットが正しく更新されていない可能性があります
python
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello, World!")
label.pack()
label["text"] = "Updated Text" # 実行後に変更されない
root.mainloop()
💗修正方法 : config()を使用してプロパティを明示的に更新します
python
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello, World!")
label.pack()
label.config(text="Updated Text") # 正しい方法
root.mainloop()