質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Tcl

Tclは、インタープリタ型のプログラミング言語。リスト処理や連想配列といった特長を持ち、文法もシンプルです。拡張や他言語への組み込みが簡単にでき、アプリケーション拡張にための組み込み言語として用いられます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

TkinterDND2でttkウィジェットにファイルやテキストをドロップできない。

Marusoftware
Marusoftware

総合スコア187

Tcl

Tclは、インタープリタ型のプログラミング言語。リスト処理や連想配列といった特長を持ち、文法もシンプルです。拡張や他言語への組み込みが簡単にでき、アプリケーション拡張にための組み込み言語として用いられます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

1評価

0クリップ

3997閲覧

投稿2020/07/17 14:27

編集2020/07/23 09:46

前提・実現したいこと

環境:
OS:Linux Mint 20
Python:3.8
Tk&Tcl:8.6
TkDND:2.6

発生している問題・エラーメッセージ

tkinterの通常ウィジェットにはドロップできるのですが、
ttkのウィジェットにドロップできません。

該当のソースコード

以下のようなファイル配置です:

/ |-tkdnd.py |-dnd_test_tkinter.py --dnd_test_ttk.py

tkdnd.py(こちらで配布されている最新版の改変版(のコメント削除版))

python3

# -*- coding: utf-8 -*- try: import Tkinter as tkinter import Tix as tix import ttk except ImportError: import tkinter from tkinter import tix from tkinter import ttk import os TkdndVersion = None # dnd actions PRIVATE = 'private' NONE = 'none' ASK = 'ask' COPY = 'copy' MOVE = 'move' LINK = 'link' REFUSE_DROP = 'refuse_drop' # dnd types DND_TEXT = 'DND_Text' DND_FILES = 'DND_Files' DND_ALL = '*' CF_UNICODETEXT = 'CF_UNICODETEXT' CF_TEXT = 'CF_TEXT' CF_HDROP = 'CF_HDROP' FileGroupDescriptor = 'FileGroupDescriptor - FileContents'# ?? FileGroupDescriptorW = 'FileGroupDescriptorW - FileContents'# ?? def _require(tkroot): '''Internal function.''' global TkdndVersion tkdndlib = os.environ.get('TKDND_LIBRARY') if tkdndlib != "__null__": if tkdndlib: tkroot.tk.eval('global auto_path; lappend auto_path {%s}' % tkdndlib) try: TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd') except tkinter.TclError: raise RuntimeError('Unable to load tkdnd library.') return TkdndVersion class DnDEvent: pass class DnDWrapper: _subst_format_dnd = ('%A', '%a', '%b', '%C', '%c', '{%CST}', '{%CTT}', '%D', '%e', '{%L}', '{%m}', '{%ST}', '%T', '{%t}', '{%TT}', '%W', '%X', '%Y') _subst_format_str_dnd = " ".join(_subst_format_dnd) tkinter.BaseWidget._subst_format_dnd = _subst_format_dnd tkinter.BaseWidget._subst_format_str_dnd = _subst_format_str_dnd def _substitute_dnd(self, *args): if len(args) != len(self._subst_format_dnd): return args def getint_event(s): try: return int(s) except ValueError: return s def splitlist_event(s): try: return self.tk.splitlist(s) except ValueError: return s A, a, b, C, c, CST, CTT, D, e, L, m, ST, T, t, TT, W, X, Y = args ev = DnDEvent() ev.action = A ev.actions = splitlist_event(a) ev.button = getint_event(b) ev.code = C ev.codes = splitlist_event(c) ev.commonsourcetypes = splitlist_event(CST) ev.commontargettypes = splitlist_event(CTT) ev.data = D ev.name = e ev.types = splitlist_event(L) ev.modifiers = splitlist_event(m) ev.supportedsourcetypes = splitlist_event(ST) ev.sourcetypes = splitlist_event(t) ev.type = T ev.supportedtargettypes = splitlist_event(TT) try: ev.widget = self.nametowidget(W) except KeyError: ev.widget = W ev.x_root = getint_event(X) ev.y_root = getint_event(Y) return (ev,) tkinter.BaseWidget._substitute_dnd = _substitute_dnd def _dnd_bind(self, what, sequence, func, add, needcleanup=True): if isinstance(func, str): self.tk.call(what + (sequence, func)) elif func: funcid = self._register(func, self._substitute_dnd, needcleanup) # FIXME: why doesn't the "return 'break'" mechanism work here?? #cmd = ('%sif {"[%s %s]" == "break"} break\n' % (add and '+' or '', # funcid, self._subst_format_str_dnd)) cmd = '%s%s %s' %(add and '+' or '', funcid, self._subst_format_str_dnd) self.tk.call(what + (sequence, cmd)) return funcid elif sequence: return self.tk.call(what + (sequence,)) else: return self.tk.splitlist(self.tk.call(what)) tkinter.BaseWidget._dnd_bind = _dnd_bind def dnd_bind(self, sequence=None, func=None, add=None): return self._dnd_bind(('bind', self._w), sequence, func, add) tkinter.BaseWidget.dnd_bind = dnd_bind def drag_source_register(self, button=None, *dndtypes): if button is None: button = 1 else: try: button = int(button) except ValueError: # no button defined, button is actually # something like DND_TEXT dndtypes = (button,) + dndtypes button = 1 self.tk.call( 'tkdnd::drag_source', 'register', self._w, dndtypes, button) tkinter.BaseWidget.drag_source_register = drag_source_register def drag_source_unregister(self): self.tk.call('tkdnd::drag_source', 'unregister', self._w) tkinter.BaseWidget.drag_source_unregister = drag_source_unregister def drop_target_register(self, *dndtypes): self.tk.call('tkdnd::drop_target', 'register', self._w, dndtypes) tkinter.BaseWidget.drop_target_register = drop_target_register def drop_target_unregister(self): self.tk.call('tkdnd::drop_target', 'unregister', self._w) tkinter.BaseWidget.drop_target_unregister = drop_target_unregister def platform_independent_types(self, *dndtypes): return self.tk.split(self.tk.call( 'tkdnd::platform_independent_types', dndtypes)) tkinter.BaseWidget.platform_independent_types = platform_independent_types def platform_specific_types(self, *dndtypes): return self.tk.split(self.tk.call( 'tkdnd::platform_specific_types', dndtypes)) tkinter.BaseWidget.platform_specific_types = platform_specific_types def get_dropfile_tempdir(self): return self.tk.call('tkdnd::GetDropFileTempDirectory') tkinter.BaseWidget.get_dropfile_tempdir = get_dropfile_tempdir def set_dropfile_tempdir(self, tempdir): self.tk.call('tkdnd::SetDropFileTempDirectory', tempdir) tkinter.BaseWidget.set_dropfile_tempdir = set_dropfile_tempdir class Tk(tkinter.Tk, DnDWrapper): def __init__(self, *args, **kw): tkinter.Tk.__init__(self, *args, **kw) self.TkdndVersion = _require(self) class TixTk(tix.Tk, DnDWrapper): def __init__(self, *args, **kw): tix.Tk.__init__(self, *args, **kw) self.TkdndVersion = _require(self)

ttkバージョン(dnd_test_ttk.py - 今回問題が発生しているものです。)

python3

from tkdnd import * from tkinter import ttk root = Tk()#ウィンドウ frame = ttk.Frame(root, width=100, height=100)#ドロップされるフレーム frame.pack(fill="both",expand=True) frame.drop_target_register(DND_FILES, DND_TEXT)#対応させるドロップフォーマット frame.dnd_bind('<<Drop>>', lambda event:print(event.data))#イベントのバインド root.mainloop()

tkinterバージョン(dnd_test_tkinter.py)

python3

from tkinter import * import tkinter root = Tk()#ウィンドウ frame = tkinter.Frame(root, width=100, height=100)#ドロップされるフレーム frame.pack(fill="both",expand=True) frame.drop_target_register(DND_FILES, DND_TEXT)#対応させるドロップフォーマット frame.dnd_bind('<<Drop>>', lambda event:print(event.data))#イベントのバインド root.mainloop()

試したこと

順序の入れ替えなど

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Tcl

Tclは、インタープリタ型のプログラミング言語。リスト処理や連想配列といった特長を持ち、文法もシンプルです。拡張や他言語への組み込みが簡単にでき、アプリケーション拡張にための組み込み言語として用いられます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。