2022/03/26(土) [n年前の日記]
#1 [python] tkinterを勉強中
Python + tkinter について勉強中。
ウィジェットを追加していくための記述が面倒臭くなってきて、配列の中に必要な情報を列挙して、ループで回してウィジェットを生成するように書き換えているところなのだけど。このまま作業を進めていくと、PySimpleGUI に辿り着くなー、と思えてきた。
_PySimpleGUI
配列に必要な情報を列挙すればレイアウトができてしまう PySimpleGUI の発想は正しい気がする。自分も結局そういう記述の仕方になりつつある…。そして、日本国内で「ネ申Excel」が誕生する理由もなんだか分かったような気分になってきた。マス目を使ってレイアウトしていくのは、やっぱり分かりやすい…。
ウィジェットを追加していくための記述が面倒臭くなってきて、配列の中に必要な情報を列挙して、ループで回してウィジェットを生成するように書き換えているところなのだけど。このまま作業を進めていくと、PySimpleGUI に辿り着くなー、と思えてきた。
_PySimpleGUI
配列に必要な情報を列挙すればレイアウトができてしまう PySimpleGUI の発想は正しい気がする。自分も結局そういう記述の仕方になりつつある…。そして、日本国内で「ネ申Excel」が誕生する理由もなんだか分かったような気分になってきた。マス目を使ってレイアウトしていくのは、やっぱり分かりやすい…。
◎ OptionMenuについて。 :
複数の選択肢の中から一つだけ選べる OptionMenu の使い方がよく分からなかったので手元で動作確認。
_02_optionmenu.py

_02_optionmenu.py
u"""
OptionMenu test.
* Windows10 x64 21H2 + Python 2.7.18 32bit + tkinter
* Windows10 x64 21H2 + Python 3.9.11 64bit + tkinter
"""
try:
# Python 2.7
import Tkinter as tk
except:
# Python 3.x
import tkinter as tk
OPT_KIND = [
"Lines",
"Boxs",
"Rect only"
]
root = tk.Tk()
root.geometry("320x240")
# reserve variable
opt = tk.StringVar(root)
opt.set(OPT_KIND[0])
lbl = tk.StringVar(root)
lbl.set("Please select")
# create widget and layout
optmenu = tk.OptionMenu(root, opt, *OPT_KIND).pack(side = tk.TOP)
label = tk.Label(root, textvariable=lbl).pack(side = tk.BOTTOM)
def callback(*args):
"""set lbl value from opt."""
v = opt.get()
if v in OPT_KIND:
idx = OPT_KIND.index(v)
else:
idx = -1
lbl.set("Select [%s], index = %d" % (v, idx))
# Call callback when variable opt is updated
opt.trace("w", callback)
root.mainloop()

- OptionMenu に指定した変数内には、配列のインデックス値ではなくて文字列が入る。
- OptionMenu に配列を指定する際は、「*lst」といった感じで、「*」を先頭につける。
- 指定した変数が更新、もしくは選択された際に特定の関数を呼びたかったら、.trace("w", hoge) を使う。
- 文字列で、配列の中身を検索して、インデックス値に変換するには、.index() を使う。
[ ツッコむ ]
以上です。