我有这个行为的简单例子:
import tkinter as tk
from tkinter import filedialog, ttk
INITIALDIR = 'C:\\'
class MainWindow(ttk.Frame):
def __init__(self, root, *args, **kwargs):
super().__init__(root, *args, **kwargs)
self.pack()
btnoptions = {'expand':True, 'fill': 'both'}
btn = ttk.Button(self, text='Select', command=self.ask_openfile)
btn.pack(**btnoptions)
def ask_openfile(self):
self.file_opt = options = {}
options['initialdir'] = INITIALDIR
filename = filedialog.askopenfilename(**self.file_opt)
return filename
if __name__=='__main__':
root = tk.Tk()
root.geometry('600x300')
MainWindow(root).pack(expand=True, fill='both', side='top')
root.mainloop()
基本上有一个大按钮,可打开一个打开的文件对话框。如果我选择一个文件并按下打开,它可以正常工作。但是,如果我双击选择文件,它会选择文件,关闭对话框,然后立即打开一个新的打开文件对话框。我的猜测,第二次点击以某种方式传递给底层窗口并再次点击按钮(按钮必须位于即将被选中的文件下)。有没有办法避免这种行为?看起来它是Windows问题,尝试在Windows 7和10与python 3.5。在debian linux上一切都很好,但是,我需要这个在Windows上工作。
答案 0 :(得分:0)
似乎这是tk的已知问题: https://core.tcl.tk/tk/tktview?name=faf37bd379
该票证表明问题已在tk 8.6.8中解决。
我在tk 8.6中遇到了这个问题,更新不是一个很好的选择,所以我试图找到其他解决方法。我尝试禁用按钮,然后启用它们,但是在启用按钮后才发生胭脂点击。我还尝试在重新启用按钮之前添加一个延迟,但这也不起作用。
我发现实际可行的两个解决方法是: 1)更改按钮以要求双击。这可以通过bind来完成。我个人不喜欢双击按钮,但是其他人可能不那么挑剔。 2)将文件选择更改为一个包含所选目录中文件列表的组合框。可以使用askdirectory代替askopenfilename来选择目录。 askdirectory要求用户单击“选择文件夹”按钮,以便双击不会出现相同的问题。