Python tkinter をいじる（ListboxとCombobox）（2024.11.18）

## はじめに
最近```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```では、選択する項目をプログラム起動時にすべて見ることができる。
好みの問題ではあるが、選択項目が非常に多い場合以外は、こちらの方が運用上見やすいかもしれない。

![IMG_2180.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/a7518213-829e-0d38-7ecb-0f1d995f459f.jpeg)


## Comboboxの作例
```Combobox```では、選択する項目は、矢印で表示させて選定する。GUIとしてはスッキリしているが、選択項目を矢印を押して表示する分、一手間かかる。

![IMG_2179.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/71ce79b9-8195-7772-e3df-5ce4a398dfa1.jpeg)


## Listbox利用のコード事例
```python
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利用のコード事例
```python
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()
```



以　上