0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python tkinter をいじる(ListboxとCombobox)(2024.11.18)

Last updated at Posted at 2024-11-17

はじめに

最近tkinterにはまっている。
実務で使いそうなwedgitとして、ListboxComboboxを触ってみた。ここで注意が必要なのは、Listboxtkのみに含まれ、Comboboxttkのみに含まれているということ。
ここで扱っているのは、すでに存在している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

Comboboxの作例

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

IMG_2179.jpeg

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()

以 上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?