2025/11/04(火) [n年前の日記]
#1 [tkinter] tkinterを使って縮小画像生成アプリを作成中
Python + tkinter + ImageMagick を使って、親父さんのWebサイト更新作業を楽にするためのGUIアプリを作成中。
既にbatファイルの形で求める処理はできているのだけど、この形では親父さんが使えるとも思えない。GUIアプリの見た目なら使えたりしないかなと…。
既にbatファイルの形で求める処理はできているのだけど、この形では親父さんが使えるとも思えない。GUIアプリの見た目なら使えたりしないかなと…。
◎ tkinterでドラッグアンドドロップ :
tkinterで表示されたウインドウ上にエクスプローラから複数ファイルをドラッグアンドドロップ(D&D、DND)してファイルパスを取得したい。できれば tkinter の Listbox上に表示したい。
tkinterdnd2 というモジュールをインストールすればドラッグアンドドロップが使えるようになる。
たしか以前も試していたような…。
_mieki256's diary - tkinterdnd2を試用
_mieki256's diary - Python + Tkinter でドラッグアンドドロップ
さておき。Listbox + tkinterdnd2 を使ったサンプルソースを書いてみた。環境は Windows11 x64 25H2 + Python 3.10.10 64bit + tkinter + tkinterdnd2 0.4.3。
_04_tkintrdnd2_with_listbox.py
Listbox に Scrollbar をつけるあたりでちょっと悩んだけれど、ググってコピペしてどうにか…。
Lisbox上のリストを操作する方法もググってどうにか…。
tkinterdnd2 というモジュールをインストールすればドラッグアンドドロップが使えるようになる。
pip install tkinterdnd2
たしか以前も試していたような…。
_mieki256's diary - tkinterdnd2を試用
_mieki256's diary - Python + Tkinter でドラッグアンドドロップ
さておき。Listbox + tkinterdnd2 を使ったサンプルソースを書いてみた。環境は Windows11 x64 25H2 + Python 3.10.10 64bit + tkinter + tkinterdnd2 0.4.3。
_04_tkintrdnd2_with_listbox.py
"""
Drag and drop file to Listbox from Windows explorer.
use tkinterdnd2.
pip install tkinterdnd2
* Windows11 x64 25H2 + Python 3.10.10 64bit + tkinterdnd2 0.4.3
"""
import tkinter as tk
from tkinterdnd2 import *
# from tkinterdnd2 import DND_FILES, TkinterDnD
def all_clear():
"""Listbox all clear"""
listbox.delete(0, tk.END)
def get_list_from_listbox():
"""Get list from Listbox"""
flist = list(listbox.get(0, tk.END))
return flist
def drop(event):
"""Drop and drop to filer"""
if listbox.get(0) == "Please file drop":
listbox.delete(0, tk.END)
lst = list(root.tk.splitlist(event.data))
# lst.sort()
for s in lst:
listbox.insert(tk.END, s)
for s in get_list_from_listbox():
print(f"[{s}]")
# Main window
root = TkinterDnD.Tk()
root.title("Drag and drop to Listbox")
# root.geometry("640x200")
LISTBOX_LIST_INIT = [
"Please file drop",
"test 1 hoge fuga piyo",
"test 2",
"test 3",
"test 4",
"test 5",
"test 6 Ut incididunt non amet elit reprehenderit elit cillum eu nostrud velit.",
"test 7",
"test 8",
"test 9",
]
frm = tk.Frame(root, relief=tk.GROOVE, bd=4)
listbox = tk.Listbox(
frm,
width=40,
height=5,
font=("Meiryo UI", 14),
justify="left",
selectmode=tk.EXTENDED,
)
for s in LISTBOX_LIST_INIT:
listbox.insert(tk.END, s)
# scrollbar
scrlbary = tk.Scrollbar(frm, orient=tk.VERTICAL, command=listbox.yview)
scrlbarx = tk.Scrollbar(frm, orient=tk.HORIZONTAL, command=listbox.xview)
listbox.configure(yscrollcommand=scrlbary.set)
listbox.configure(xscrollcommand=scrlbarx.set)
btn = tk.Button(root, text="List Clear", command=all_clear)
# layout
frm.pack(fill=tk.BOTH, expand=True, padx=12, pady=12)
listbox.grid(row=0, column=0, sticky=tk.NSEW)
scrlbary.grid(row=0, column=1, sticky=tk.NS)
scrlbarx.grid(row=1, column=0, sticky=tk.EW)
frm.grid_columnconfigure(0, weight=1)
frm.grid_rowconfigure(0, weight=1)
btn.pack(padx=8, pady=8)
# drag and drop bind
listbox.drop_target_register(DND_FILES)
listbox.dnd_bind("<<Drop>>", drop)
root.mainloop()
Listbox に Scrollbar をつけるあたりでちょっと悩んだけれど、ググってコピペしてどうにか…。
- Scrollbar の command= に Listbox の .xview や .yview を指定。
- Listbox の xscrollcommand= や yscrollcommand= に、Scrollbar の .set を指定。
Lisbox上のリストを操作する方法もググってどうにか…。
- リストを全消去したい時は、listbox.delete(0, tk.END) でいいらしい。0 が一番最初の項目。tk.END が一番最後の項目を示している。らしい。たぶん。
- Listbox上のリストを、Python のリスト(配列)として取得したいなら、flist = list(listbox.get(0, tk.END)) みたいな感じで。.get() を呼ぶと項目群がタプル(「(」「)」で挟まれてるアレ)の形で返ってくるけれど、list() で囲んでやることでタプルをリスト(配列、「[」「]」で挟まれてるアレ)に変換できる。
- Listbox に項目を追加するなら、listbox.insert(tk.END, s) みたいな感じで。最後の項目を示す場所に s を挿入、ということらしい。
[ ツッコむ ]
以上、1 日分です。
