mieki256's diary



2021/12/10(金) [n年前の日記]

#1 [python] tkinterdnd2を試用

Python + tkinter を使うと、ちょっとしたGUIアプリを作ることができるのだけど、tkinter の標準状態ではドラッグアンドロップ(DnD、D&D)を受け付ける機能が無いそうで。例えば、Windows のエクスプローラ等から tkinter のウインドウにファイルアイコンをD&Dしてもファイルパスを取得することができない。

そのあたりどうにかできないのかなとググってみたら、tkinterdnd2 というライブラリをインストールするとできるようになると知ったので、手元で少し試してみた。

環境は Windows10 x64 21H1 + Python 3.9.9 x64。

_【Python】tkinter:ファイルのドラッグアンドドロップ(パス取得、画像表示) | OFFICE54
_Eliav2/tkinterdnd2: Tkinter native drag and drop support for windows, unix and Mac OSX.
_tkinterdnd2 - PyPI

インストール。 :

昔は、tkinterdnd2 を使うためには、TkDND というTkの拡張パッケージを別途インストールする必要があったのだけど。

_mieki256's diary - Python + Tkinter でドラッグアンドドロップ

今現在は、tkinterdnd2 を pip でインストーするだけで使えるようになる模様。github上のファイル群を眺めたら *.dll も並んでいたので、必要な *.dll も pip で入れてくれるのだろう。

pip install tkinterdnd2

今回は tkinterdnd2 0.3.0 がインストールされた。

動作サンプル。 :

解説記事を参考にしつつ、tk.Entry(InputBox相当、入力フィールド) にファイルをD&Dすれば、ファイルパスが入るスクリプトを書いてみた。

_02_tkintrdnd2_sample2.py
import tkinter as tk
from tkinter import ttk
from tkinterdnd2 import *

def drop(event):
    print(event.data)
    text.set(event.data)

root = TkinterDnD.Tk()
root.geometry("640x100")
root.title("Drag and drop with Entry")

text = tk.StringVar()
text.set("Please file drop")

entry = ttk.Entry(root, textvariable=text)
entry.pack(expand=True, fill=tk.X, padx=16, pady=8)

entry.drop_target_register(DND_FILES)
entry.dnd_bind("<<Drop>>", drop)

root.mainloop()

02_tkintrdnd2_sample2_py_ss.gif

エクスプローラからファイルをD&Dして、ファイルパスを取得できた。

ちなみに、巷の解説記事ではスクリプト内で .dnd_bind("<>", drop) と記述されていたけど、現行バージョンではその記述だと動かなった。.dnd_bind("<<Drop>>", drop) にしてみたら動いてくれた。

windnd を試用。 :

ググっていたら、windnd というライブラリをインストールすることでもD&Dが使えるようになると知った。

_windnd - PyPI
_cilame/windnd
_Arrastrar y soltar archivo de implementacion de Python + tkinter

github上のソースを眺めてみたけれど、Windows API を使ってD&Dを使えるようにしているっぽい。tkinterdnd2 の場合は動作させるために複数の *.dll をインストールするけれど、windnd は .pyファイル一つで実現している模様。

もちろん、Windows API を使っているから Windows上でしか使えないというデメリットはあるけれど、Windows上でしか使わないスクリプトであれば問題にはならないはず。

試しにインストールしてサンプルを書いてみた。

pip install windnd

_01_windnd_sample1.py
import tkinter as tk
import windnd

def dragged_files(files):
    s = ";".join((item.decode("utf-8") for item in files))
    text.set(s)
    print(text.get())

root = tk.Tk()

text = tk.StringVar()
text.set("Please file drop")

entry = tk.Entry(root, textvariable=text, width=80)
entry.pack(expand=True, fill=tk.X, padx=16, pady=8)

windnd.hook_dropfiles(root, func=dragged_files)

root.mainloop()

01_windnd_sample1_py_ss.gif

こちらも動いてくれた。

#2 [python] guizero や PySimpleGUI を少し試用

guizero という、Python用のGUIライブラリがあると知った。Python + tkinter のラッパーらしくて、記述量を減らして簡単に使えるようにしたものらしい。

_PythonとguizeroでGUIアプリケーションを手軽に作ってみる - あっきぃ日誌
_guizeroで簡単にPythonでGUI|gadgetking|note
_About - guizero
_Getting started with GUIs - Introduction | Raspberry Pi Projects

気になったので少しだけ試用。環境は Windows10 x64 21H1 + Python 3.9.9 x64。

pip install guizero

guizero 1.2.0 がインストールされた。

チュートリアル記事を眺めながら手元で動作確認したけれど、たしかに簡単に使える印象。入力ボックスやボタンだけ並んでいれば事足りるなら、十分使えそうな気がする。学習用というか、簡単なGUIアプリ作成の入門として、結構イイ感じかもしれない。

もっとも、ウィジェットの配置等、細かくカスタマイズしようとすると、途端に厳しくなってくる印象も受けた。やはりこのあたり、簡単に使えることと、機能の豊富さは、トレードオフなのだろうな…。

PySimpleGUIを試用。 :

ついでに、PySimpleGUI についても軽く復習した。これも tkinter を簡単に使えるようにするためのラッパーだった気がする。

_PySimpleGUI - PyPI
_PySimpleGUI
_PySimpleGUI/readme.ja.md at master ・ PySimpleGUI/PySimpleGUI
_Cookbook - PySimpleGUI
_Tkinterを使うのであればPySimpleGUIを使ってみたらという話 - Qiita

これも pip でインストールできる。

pip install PySimpleGUI

PySimpleGUI 4.55.1 がインストールされた。

利用するメリットとしては、リストを書くだけでウィジェットのレイアウトができるあたりだろうか…。Gridレイアウトに決め打ちしてしまうことで、レイアウト作業を簡単にするという方向性なのかなと。

関連情報をググっていたら、PySimpleGUIQt なるものもあると知った。名前からして tkinter ではなく Qt のラッパーなのかな。tkinter と違って、Qt なら最初からD&Dをサポートしている、といったメリットがあるらしい。

_PySimpleGUIQt - PyPI

PySimpleGUIQt の場合、動作には PySide2 が必要と書いてあるように見える。また、import PySimpleGUI を import PySimpleGUIQt に変えるだけで基本的には動くはず、とも書いてある。そのうち試してみよう…。

#3 [windows] IEでWebサイトが開けない問題

某所から、メールでPCトラブル相談を受けた。Windows 8.1上で、Microsoft Edge を起動したら、その後 IE11 でWebサイトが開けなくなって、仕事で利用しているIEに特化したWebサービスが利用できなくなったとのことで。

ググってみたところ、Microsoft Edge には、IE11 でサイトを開こうとすると Microsoft Edge で開いてしまう機能があるようで…。

_IEのブラウザ起動時にMicrosoft Edgeが起動してしまう事象 - サービスをご利用のお客様へ
_IE で開いていたページが Microsoft Edge にリダイレクトされる動作について | Japan Developer Support Internet Team Blog
_IEで開きたいのにEdgeに切り替わってしまう場合 | 新着情報・セミナー・展示会情報
_「Edge にリダイレクト」しないようにするにはどうしたらよいのでしょうか - Microsoft コミュニティ

Microsoft Edge の設定を変更することで、IE11で開けるように戻せるらしい。

1. Microsoft Edgeを起動します。
2. [・・・]ー[設定]メニューを開きます。
3. 「既定のブラウザー」を選択します。
4. 「Internet Explorerに Microsoft Edgeでサイトを開かせる」項目を「互換性のないサイトのみ(推奨)」もしくは「なし」に変更します。

IEのブラウザ起動時にMicrosoft Edgeが起動してしまう事象 - サービスをご利用のお客様へ より


某所に伝えたところ、この通りに設定を変更したら解決したとのこと。良かった…。

それにしても、こんな機能を Microsoft Edge が持っていたとは知らなかった。勉強になった。

以上、1 日分です。

過去ログ表示

Prev - 2021/12 - 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 31

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project