tkinter askopenfilename doubleclick将事件传递给父级

时间:2016-02-18 20:55:03

标签: python windows python-3.x tkinter

我有这个行为的简单例子:

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上工作。

1 个答案:

答案 0 :(得分:0)

似乎这是tk的已知问题: https://core.tcl.tk/tk/tktview?name=faf37bd379

该票证表明问题已在tk 8.6.8中解决。

我在tk 8.6中遇到了这个问题,更新不是一个很好的选择,所以我试图找到其他解决方法。我尝试禁用按钮,然后启用它们,但是在启用按钮后才发生胭脂点击。我还尝试在重新启用按钮之前添加一个延迟,但这也不起作用。

我发现实际可行的两个解决方法是: 1)更改按钮以要求双击。这可以通过bind来完成。我个人不喜欢双击按钮,但是其他人可能不那么挑剔。 2)将文件选择更改为一个包含所选目录中文件列表的组合框。可以使用askdirectory代替askopenfilename来选择目录。 askdirectory要求用户单击“选择文件夹”按钮,以便双击不会出现相同的问题。