【问题标题】:tkinter askopenfilename doubleclick passes event to parenttkinter askopenfilename 双击将事件传递给父级
【发布时间】:2023-04-06 17:24:01
【问题描述】:

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

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

【问题讨论】:

  • 如果您确实是第二次点击按钮,请禁用 ask_openfle() 中的按钮,即 state=DISABLED effbot.org/tkinterbook/button.htm 或 pack_forget() 将其删除。
  • 这是什么版本的python?这是 Windows 平台上的一个错误,但几年前 IIRC 已修复。
  • 在 Win10 上使用 3.5.1,从 IDLE 编辑器运行,我没有重新出现对话框。我添加了print(filename) 以确认该对话框的名称。我尝试了两次以确保我的双击速度足够快。
  • 这是 Windows 10 上的 python 3.5.1(在 win7 上相同,具有相同的 python 版本(64 位和 32 位))从脚本运行,而不是从空闲状态运行。
  • 尝试从空闲状态运行,结果完全一样。而且我不需要快速双击“非常”,正常双击就足以获得这种行为。

标签: python windows python-3.x tkinter


【解决方案1】:

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

那张票说问题已在 tk 8.6.8 中得到解决。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多