如何防止tkinter拖放文件后插入括号并调整输入框宽度
问题解决方法
拖放路径出现大括号是tkinterdnd2的默认转义逻辑:当路径包含空格时,库会自动用大括号包裹路径做边界标识,直接取e.data就会把大括号一起带出来。
去除多余大括号
不要直接把e.data插入输入框,先做路径解析即可。官方推荐用tkinter内置的splitlist方法处理,能自动剥离大括号,还能兼容多文件拖放的场景:
# 解析拖放数据,返回拆分好的路径元组,自动移除所有包裹用的大括号 file_paths = event.widget.tk.splitlist(event.data)
如果只需要单文件路径,取元组第一个元素即可。
调整输入框宽度
两种常用方案:
- 静态设置:创建
Entry组件时传入width参数,单位是英文字符宽度,比如设置为60字符宽:e1 = tk.Entry(master, width=60) - 自适应拉伸:grid布局下给组件加
sticky=tk.EW属性,同时给所在列设置权重,输入框会跟着窗口横向拉伸占满可用空间:e1.grid(row=0, column=1, sticky=tk.EW) # 给第1列设置权重为1,允许横向拉伸 master.grid_columnconfigure(1, weight=1)
修正后的完整代码
import tkinter as tk from tkinterdnd2 import TkinterDnD, DND_FILES def ensayo(): print("输入栅格路径:", e1.get()) print("输出路径:", e2.get()) master = TkinterDnD.Tk() tk.Label(master, text="Input raster:").grid(row=0, padx=5, pady=3) tk.Label(master, text="Output:").grid(row=1, padx=5, pady=3) # 初始化输入框,设置初始宽度 e1 = tk.Entry(master, width=60) e2 = tk.Entry(master, width=60) e1.grid(row=0, column=1, padx=5, pady=3, sticky=tk.EW) e2.grid(row=1, column=1, padx=5, pady=3, sticky=tk.EW) # 配置列拉伸权重 master.grid_columnconfigure(1, weight=1) def on_drop(event, target_entry): # 清空输入框原有内容 target_entry.delete(0, tk.END) # 解析拖放路径,自动去除大括号 valid_paths = master.tk.splitlist(event.data) # 插入第一个文件路径,多文件场景可自行拼接 target_entry.insert(0, valid_paths[0]) tk.Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=tk.W, pady=4, padx=5) tk.Button(master, text='Show', command=ensayo).grid(row=3, column=1, sticky=tk.W, pady=4, padx=5) # 注册拖放、绑定事件 e1.drop_target_register(DND_FILES) e1.dnd_bind('<<Drop>>', lambda e: on_drop(e, e1)) e2.drop_target_register(DND_FILES) e2.dnd_bind('<<Drop>>', lambda e: on_drop(e, e2)) tk.mainloop()
内容的提问来源于stack exchange,提问作者David Montoya González
相关产品推荐
相关产品推荐

