mieki256's diary



2025/11/04(火) [n年前の日記]

#1 [tkinter] tkinterを使って縮小画像生成アプリを作成中

Python + tkinter + ImageMagick を使って、親父さんのWebサイト更新作業を楽にするためのGUIアプリを作成中。

既にbatファイルの形で求める処理はできているのだけど、この形では親父さんが使えるとも思えない。GUIアプリの見た目なら使えたりしないかなと…。

tkinterでドラッグアンドドロップ :

tkinterで表示されたウインドウ上にエクスプローラから複数ファイルをドラッグアンドドロップ(D&D、DND)してファイルパスを取得したい。できれば tkinter の Listbox上に表示したい。

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_ss01.png

_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 日分です。

過去ログ表示

Prev - 2025/11 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project