はじめに
最近tkinter
にはまっている。
実務で使いそうなwedgit
として、Listbox
とCombobox
を触ってみた。ここで注意が必要なのは、Listbox
はtk
のみに含まれ、Combobox
はttk
のみに含まれているということ。
ここで扱っているのは、すでに存在しているjpg
画像を、リストから選択して表示させるもの。jpg
画像はPIL
による処理が必要なことに注意。表示はLabel
上に行っている。
なお、当方の環境は以下の通り。
MacBook Pro 14"
Chip Apple M1 Pro
Memory 16GB
macOS Sequoia 15.1
Python 3.13.0
Tcl/Tk 9.00
matplotlib 3.9.2
Listboxの作例
Listbox
では、選択する項目をプログラム起動時にすべて見ることができる。
好みの問題ではあるが、選択項目が非常に多い場合以外は、こちらの方が運用上見やすいかもしれない。
Comboboxの作例
Combobox
では、選択する項目は、矢印で表示させて選定する。GUIとしてはスッキリしているが、選択項目を矢印を押して表示する分、一手間かかる。
Listbox利用のコード事例
import tkinter as tk
from tkinter import ttk
from PIL import ImageTk, Image
def show_fig(fnameF):
im_org=Image.open(fnameF)
w,h=im_org.size
px=int(400)
py=int(px*h/w)
im_resize=im_org.resize((px,py))
img = ImageTk.PhotoImage(im_resize)
sub_win=tk.Toplevel()
sxy='{0}x{1}'.format(px,py)
sub_win.title('M-N diagram ({0})'.format(sxy))
label_i=tk.Label(sub_win,image=img)
label_i.pack()
sub_win.protocol('WM_DELETE_WINDOW', sub_win.destroy)
sub_win.mainloop()
def selected_value(lbox):
dir='./slab/'
n = lbox.curselection()
fnameF=lbox.get(n)
fnameF=dir+fnameF
show_fig(fnameF)
def main():
root = tk.Tk()
root.resizable(False,False)
root.title('Listbox')
option = [
'fig_slab_t0200.jpg',
'fig_slab_t0250.jpg',
'fig_slab_t0300.jpg',
'fig_slab_t0350.jpg',
'fig_slab_t0400.jpg',
'fig_slab_t0500.jpg',
'fig_slab_t0750.jpg',
'fig_slab_t1000.jpg'
]
lbox = tk.Listbox(root,height=len(option))
for item in option:
lbox.insert(tk.END, item)
lbox.pack()
button = ttk.Button(root, text='Select', command=lambda:selected_value(lbox))
button.pack()
root.mainloop()
if __name__ == "__main__": main()
Combobox利用のコード事例
import tkinter as tk
from tkinter import ttk
from PIL import ImageTk, Image
def show_fig(fnameF):
im_org=Image.open(fnameF)
w,h=im_org.size
px=int(400)
py=int(px*h/w)
im_resize=im_org.resize((px,py))
img = ImageTk.PhotoImage(im_resize)
sub_win=tk.Toplevel()
sxy='{0}x{1}'.format(px,py)
sub_win.title('M-N diagram ({0})'.format(sxy))
label_i=tk.Label(sub_win,image=img)
label_i.pack()
sub_win.protocol('WM_DELETE_WINDOW', sub_win.destroy)
sub_win.mainloop()
def selected_value(combo):
dir='./slab/'
fnameF=combo.get()
fnameF=dir+fnameF
show_fig(fnameF)
def main():
root = tk.Tk()
root.resizable(False,False)
root.title('Combobox')
option = [
'fig_slab_t0200.jpg',
'fig_slab_t0250.jpg',
'fig_slab_t0300.jpg',
'fig_slab_t0350.jpg',
'fig_slab_t0400.jpg',
'fig_slab_t0500.jpg',
'fig_slab_t0750.jpg',
'fig_slab_t1000.jpg'
]
combo = ttk.Combobox(root,values=option,height=len(option))
combo.pack()
combo.set(option[0])
button = ttk.Button(root, text='Select', command=lambda:selected_value(combo))
button.pack()
root.mainloop()
if __name__ == "__main__": main()
以 上