什么可能导致 Tkinter/Python 中打开的文件对话框窗口在用户选择文件后关闭速度真的很慢?

Posted

技术标签:

【中文标题】什么可能导致 Tkinter/Python 中打开的文件对话框窗口在用户选择文件后关闭速度真的很慢?【英文标题】:What could cause an open file dialog window in Tkinter/Python to be really slow to close after the user selects a file? 【发布时间】:2014-03-18 23:02:27 【问题描述】:

我可以在我的程序中执行以下操作来获得一个简单的打开文件对话框并打印选定的文件路径。不幸的是,当用户选择文件时,它并没有立即消失,而是停留了 5 分钟以上。 在执行更多 python 代码之前如何使窗口在选择后立即消失?在 Tkinter 代码之后,我尝试使用 OpenCV 导入一些视频,我认为这可能会导致速度变慢。我的 OpenCV 代码确实执行正确,我认为仅此一项没有问题(即某些交互导致错误,并且可能在 Tkinter 结束其 GUI 对话框之前启动了一些密集的过程)。

import Tkinter as Tk
import cv2
from tkFileDialog import askopenfilename
root = Tk.Tk()
root.withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)

cap = cv2.VideoCapture('video.mp4')   # this works just fine 

如果有用的话,我正在使用 Python 2.7 和 Mac OS X 10.9。

[编辑:这对所有人来说似乎都不是问题,但对我来说是这样,所以我将问题更改为还包括调试问题。在 Tkinter 打开文件对话框窗口在 GUI 中关闭之前,我不希望执行任何操作。似乎我的程序中的后续步骤(打开的 cv 视频导入)可能会以某种方式导致 Tkinter 减慢速度,所以我想确保它在任何新进程开始之前关闭。同样,Tkinter 窗口实际上会在 5 分钟后关闭...]

【问题讨论】:

对话框对我来说消失了。当对话框出现时,您是否单击“打开”按钮?单击“打开”或双击文件应该会使对话框消失。 嗯 - 我不会消失。知道如何调试吗? 编辑后,听起来您没有让事件循环有机会处理所有事件。如果在获取文件名后调用root.update() 会发生什么? 不幸的是同样的事情 注释掉视频捕获调用会发生什么? 【参考方案1】:

我在使用 Tkinter 对话框时遇到了一些问题。像你一样,在我选择了一个文件后,对话框就坐在那里。我没有尝试离开它很长时间,它可能会在 5 分钟后消失,就像你说的那样。经过大量随机实验后,我发现调用root.update() before askopenfilename() 行似乎可以解决问题。

作为参考,这是我用来测试的代码:

import sys
from tkinter import *
from tkinter import filedialog

#instantiate a Tk window
root = Tk()

#set the title of the window
root.title('Tk test')

# I don't know, what this does, but it fixes askopenfilename if I use it.
root.update()

print(filedialog.askopenfilename(title='dialogue? surely.'))

【讨论】:

在 OSX 和 python2 上不适合我。在我处理输入文件时,对话框仍然存在。 编辑:调用root.update() 之后 askopenfilename() 工作,但是。 tkinter on mac 似乎正在等待事件循环。在“成熟”的 tkinter 应用程序中,这是理所当然的,但是在不使用主窗口的控制台脚本的上下文中,需要 root.update() (在 askopenfilename() 调用之后)才能启动事件循环,允许对话框完成其操作并关闭。我不知道为什么这在 macOS 和 Windows 上有所不同 解释一下为什么必须在之前(至少在 macos 和 Python3 上)会很有趣。 为我工作,Ubuntu 18.04。在调用 askdirectory() 之后,还修复了在对话框出现之前发生的随机延迟。非常有用的答案。【参考方案2】:

正是我遇到的问题 - 有时文件对话框会在一段时间后消失,有时不会。但它似乎总是阻止以后的状态窗口。添加 root.update() 立即解决了这两个问题。

【讨论】:

以上是关于什么可能导致 Tkinter/Python 中打开的文件对话框窗口在用户选择文件后关闭速度真的很慢?的主要内容,如果未能解决你的问题,请参考以下文章

创建新建时关闭现有的顶层。 Tkinter Python 3

pythonGUI编程-tkinter

如何在不单击tkinter python的情况下读取单选按钮值

在 Tkinter Python 中显示字典

如何在 Tkinter Python 中删除窗口背景

python GUI编程(Tkinter)