首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将资源管理器文件拖放到tkinter entry小工具?

将资源管理器文件拖放到tkinter entry小工具?
EN

Stack Overflow用户
提问于 2013-01-10 21:50:30
回答 3查看 36.4K关注 0票数 27

我对Python还是个新手。我正在尝试输入TKinter entry小部件的文件名(完整路径)。由于文件名的路径可能很长,因此我希望能够直接从Windows资源管理器拖放文件。在Perl中,我看到了以下内容:

代码语言:javascript
运行
AI代码解释
复制
use Tk::DropSite;
.
.
my $mw = new MainWindow;
$top = $mw->Toplevel;
$label_entry = $top->Entry(-width => '45',. -background => 'ivory2')->pack();
$label_entry->DropSite(-dropcommand => \&drop,-droptypes => 'Win32',);

在Python语言中有没有类似的东西可以用TKinter来做?

EN

回答 3

Stack Overflow用户

发布于 2013-01-11 17:24:42

Tk没有任何命令来处理这一点,Python也不包括任何额外的Tk扩展来执行应用程序间的拖放,因此您需要一个扩展来执行该操作。Tkdnd ( http://sourceforge.net/projects/tkdnd上的Tk扩展,而不是Tkdnd.py模块)适合我。要在Python中使用它,需要一个包装器。快速搜索一个,似乎http://mail.python.org/pipermail/tkinter-discuss/2005-July/000476.html包含这样的代码。我做了另一个,因为我不喜欢另一个。我的包装器的问题是它是高度未经测试的,实际上我只使用了函数bindtarget,并且只使用了大约10秒钟。

使用下面的包装器,您可以创建一些小部件并宣布它支持接收拖动的文件。这里有一个例子:

代码语言:javascript
运行
AI代码解释
复制
# The next two lines are not necessary if you installed TkDnd
# in a proper place.
import os
os.environ['TKDND_LIBRARY'] = DIRECTORYTOTHETKDNDBINARY

import Tkinter
from untested_tkdnd_wrapper import TkDND

root = Tkinter.Tk()

dnd = TkDND(root)

entry = Tkinter.Entry()
entry.pack()

def handle(event):
    event.widget.insert(0, event.data)

dnd.bindtarget(entry, handle, 'text/uri-list')

root.mainloop()

下面是untested_tkdnd_wrapper.py的代码

代码语言:javascript
运行
AI代码解释
复制
import os
import Tkinter

def _load_tkdnd(master):
    tkdndlib = os.environ.get('TKDND_LIBRARY')
    if tkdndlib:
        master.tk.eval('global auto_path; lappend auto_path {%s}' % tkdndlib)
    master.tk.eval('package require tkdnd')
    master._tkdnd_loaded = True


class TkDND(object):
    def __init__(self, master):
        if not getattr(master, '_tkdnd_loaded', False):
            _load_tkdnd(master)
        self.master = master
        self.tk = master.tk

    # Available pre-defined values for the 'dndtype' parameter:
    #   text/plain
    #   text/plain;charset=UTF-8
    #   text/uri-list

    def bindtarget(self, window, callback, dndtype, event='<Drop>', priority=50):
        cmd = self._prepare_tkdnd_func(callback)
        return self.tk.call('dnd', 'bindtarget', window, dndtype, event,
                cmd, priority)

    def bindtarget_query(self, window, dndtype=None, event='<Drop>'):
        return self.tk.call('dnd', 'bindtarget', window, dndtype, event)

    def cleartarget(self, window):
        self.tk.call('dnd', 'cleartarget', window)


    def bindsource(self, window, callback, dndtype, priority=50):
        cmd = self._prepare_tkdnd_func(callback)
        self.tk.call('dnd', 'bindsource', window, dndtype, cmd, priority)

    def bindsource_query(self, window, dndtype=None):
        return self.tk.call('dnd', 'bindsource', window, dndtype)

    def clearsource(self, window):
        self.tk.call('dnd', 'clearsource', window)


    def drag(self, window, actions=None, descriptions=None,
            cursorwin=None, callback=None):
        cmd = None
        if cursorwin is not None:
            if callback is not None:
                cmd = self._prepare_tkdnd_func(callback)
        self.tk.call('dnd', 'drag', window, actions, descriptions,
                cursorwin, cmd)


    _subst_format = ('%A', '%a', '%b', '%D', '%d', '%m', '%T',
            '%W', '%X', '%Y', '%x', '%y')
    _subst_format_str = " ".join(_subst_format)

    def _prepare_tkdnd_func(self, callback):
        funcid = self.master.register(callback, self._dndsubstitute)
        cmd = ('%s %s' % (funcid, self._subst_format_str))
        return cmd

    def _dndsubstitute(self, *args):
        if len(args) != len(self._subst_format):
            return args

        def try_int(x):
            x = str(x)
            try:
                return int(x)
            except ValueError:
                return x

        A, a, b, D, d, m, T, W, X, Y, x, y = args

        event = Tkinter.Event()
        event.action = A       # Current action of the drag and drop operation.
        event.action_list = a  # Action list supported by the drag source.
        event.mouse_button = b # Mouse button pressed during the drag and drop.
        event.data = D         # The data that has been dropped.
        event.descr = d        # The list of descriptions.
        event.modifier = m     # The list of modifier keyboard keys pressed.
        event.dndtype = T
        event.widget = self.master.nametowidget(W)
        event.x_root = X       # Mouse pointer x coord, relative to the root win.
        event.y_root = Y
        event.x = x            # Mouse pointer x coord, relative to the widget.
        event.y = y

        event.action_list = str(event.action_list).split()
        for name in ('mouse_button', 'x', 'y', 'x_root', 'y_root'):
            setattr(event, name, try_int(getattr(event, name)))

        return (event, )

与Tkdnd一起,你会发现一个tkdnd.tcl程序,它比它自己提供的C扩展更高级。我没有包装这个较高级的代码,但是用Python复制它可能比使用这个较低级别的包装器更有趣。

票数 23
EN

Stack Overflow用户

发布于 2017-10-21 16:11:32

自从这个问题最初发布以来,事情已经取得了进展,SourceForge.net上已经可以很容易地获得tkdnd2.8 (Tcl扩展)和TkinterDnD2 (tkdnd2.8的Python包装器)。

这是一个最小的示例代码,可以完全按照您的要求完成任务。

代码语言:javascript
运行
AI代码解释
复制
import Tkinter
from TkinterDnD2 import *

def drop(event):
    entry_sv.set(event.data)

root = TkinterDnD.Tk()
entry_sv = Tkinter.StringVar()
entry = Tkinter.Entry(root, textvar=entry_sv, width=80)
entry.pack(fill=Tkinter.X)
entry.drop_target_register(DND_FILES)
entry.dnd_bind('<<Drop>>', drop)
root.mainloop()

你可以在Python2.7和3.6上查看How to Install and Use TkDnD with Python 2.7 Tkinter on OSX的下载和安装信息。

票数 18
EN

Stack Overflow用户

发布于 2021-12-07 01:55:33

你现在可以简单地使用tkinterdnd2了。我已经派生了它,构建了它,并上传到pypi,这样你就可以简单地pip install tkinterdnd2了。用法示例here

或者,如果你太轻率,这里有一个简单的例子:

代码语言:javascript
运行
AI代码解释
复制
import tkinter as tk

from tkinterdnd2 import DND_FILES, TkinterDnD

root = TkinterDnD.Tk()  # notice - use this instead of tk.Tk()

lb = tk.Listbox(root)
lb.insert(1, "drag files to here")

# register the listbox as a drop target
lb.drop_target_register(DND_FILES)
lb.dnd_bind('<<Drop>>', lambda e: lb.insert(tk.END, e.data))

lb.pack()
root.mainloop()

这将打开这个

您只需拖动文件即可

(顺便说一句,我使用了listbox而不是entry,但它的工作方式是完全相同的)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14267900

复制
相关文章
python抛出异常和捕获异常_在try块中可以抛出异常吗
2.解析 关键字try 以及except是 使用Python 解释器主动抛出异常的关键, Python解释器从上向下执行 当运行try中的某行代码出错,会直接进入except中执行下方代码 try中错行下方的代码不会被运行 except…as… 是固定的语法格式 打印traceback信息 finally 后的代码不管是否抛出异常都会执行 except 的原理 调用sys中 exc.info 方法返回基本信息 所以抛出异常的第一步拓展可以在这里开始 注意 每个关键字下方的代码都是独立的(所有的变量都是局部变量)
全栈程序员站长
2022/11/02
4.7K0
c++构造函数是否可以抛出异常_什么叫抛出异常
从语法上来说,构造函数可以抛出异常。但从逻辑上和风险控制上,构造函数中尽量不要抛出异常。万不得已,一定要注意防止内存泄露。
全栈程序员站长
2022/09/22
1.7K1
【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
1. 异常处理 : 使用 " try{}catch(){} " 将抛出异常的代码包起来 , 注意将可能抛出异常的代码包裹在 try 后的大括号中 , 将异常处理逻辑放在 catch 后的大括号中 ;
韩曙亮
2023/03/27
1.4K0
Java 如何抛出异常、自定义异常
1、定义 : 一个方法不处理这个异常,而是调用层次向上传递,谁调用这个方法,这个异常就由谁来处理。
Java编程指南
2019/08/02
4.8K0
Java 如何抛出异常、自定义异常
Java 如何抛出异常、自定义异常[通俗易懂]
1、定义 : 一个方法不处理这个异常,而是调用层次向上传递,谁调用这个方法,这个异常就由谁来处理。
全栈程序员站长
2022/07/29
4.2K0
Java 如何抛出异常、自定义异常[通俗易懂]
Python 自定义异常与抛出异常
自定义异常与抛出异常 自定义抛出异常raise 将信息以报错的形式抛出 用法 rais 异常类型(message) 参数 message:错误信息 返回值 无返回值 自定义异常类 继承基类——Exception 在构造函数中定义错误信息 代码 # coding:utf-8 def test(number): if number == 100: raise ValueError('number 不可以是100') return number # result = test
Zkeq
2022/05/18
7380
Java-抛出异常、自定义异常类
众所周知,当程序运行过程中,如果遇到了错误(比如数组下标越界,空指针等)程序就会自动终止,但这种错误一般是偶然的,可能是用户输入不呵呵程序编写者的意图导致,而不是程序本身问题,这是我们要做的,是让操作者知道发生了什么事情,而不是直截了当的结束程序,这时我们就用到了异常处理(语句发生错误时,只抛出异常,而不结束程序)。
圆号本昊
2021/09/24
1.4K0
Java-抛出异常、自定义异常类
python如何抛出异常_python自定义异常
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/02
7200
Python抛出异常_python抛出异常的作用
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
全栈程序员站长
2022/11/02
2.6K0
python抛出异常和捕获异常_python自定义异常
有时,程序需要主动抛出异常,因为某些情况下,你需要反馈消息给更上层的调用者,告诉它有一些异常情况发生,而你抛出异常的地方,没有能力处理它,因此需要向上抛出异常。
全栈程序员站长
2022/11/07
9840
自定义异常并抛出,捕获
# 需求:类创建人的对象:初始化年龄0,让用户输入自己的年龄:1-100合法 小于1或大于100 抛出异常 # 自定义异常 -- 自定义异常类 也要继承exception class AgeError(Exception): def __init__(self): self.error_msg = 'AgeError: 年龄应该是在1-100之间!' def __str__(self): return self.error_msg class Person
汪凡
2018/05/29
5680
python自定义异常和主动抛出异常(raise)
有时候python自带异常不够用,如同java,python也可以自定义异常,并且可以手动抛出。注意,自定义异常只能由自己抛出。python解释器是不知道用户自定义异常是什么鬼的。
全栈程序员站长
2022/11/02
1.6K0
feign client抛出自定义异常
十毛
2023/10/16
7520
异常1.异常简介2.捕获异常3.异常的传递4.抛出自定义的异常 5.异常处理中抛出异常
打开一个不存在的文件123.txt,当找不到123.txt文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt(没有123.txt这样的文件或目录)
Python攻城狮
2018/08/23
1.9K0
异常1.异常简介2.捕获异常3.异常的传递4.抛出自定义的异常
5.异常处理中抛出异常
python抛出异常会终止程序吗_python抛出异常的作用
当python执行无效的代码时,就会抛出异常。用 try 和 catch 语句可以处理异常,以避免程序的崩溃。我们也可以在代码中抛出自己的异常,抛出异常意味着 停止运行这个函数中的代码,将程序执行转到except语句
全栈程序员站长
2022/11/02
1.8K0
【Kotlin】空安全 ⑤ ( 异常处理 | 捕获并处理异常 | 抛出自定义异常 )
如果变量为空 , 则直接抛出 kotlin.KotlinNullPointerException 异常 ;
韩曙亮
2023/03/30
8570
【Kotlin】空安全 ⑤ ( 异常处理 | 捕获并处理异常 | 抛出自定义异常 )
python3异常可直接抛出_python自定义异常
这篇文章主要介绍python抛出异常的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
全栈程序员站长
2022/11/02
5380
android 抛出FileNotFoundException异常
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
1.6K0
点击加载更多

相似问题

Ajax调用返回函数而不是数据

112

返回空值而不是xml数据的Ajax调用

11

Ajax返回对象而不是数据

20

jQuery ajax返回负数而不是内容

10

jQuery .find()对来自.ajax()调用的数据返回"[object Object]“,而不是div

173
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档