问题
有没有办法自动化 tkFileDialog
的选择并运行它通过 unittest
?以下是我应用程序中唯一使用 tkinter
的方式:
root = Tkinter.Tk()
types = [('Comma Separated Values', '.csv'), ('All Files', '*')]
filename = tkFileDialog.askopenfilename(parent=root,
filetypes=types)
root.destroy()
编辑:我没有提到这部分代码被困在了一个我无法控制的类的方法调用中。
背景
我建立了一个本地应用程序,在localhost
上创建了一个HTTP服务器,并在Web浏览器中使用HTML/CSS/JS运行其GUI。由于浏览器限制,我无法使用内置文件对话框,因此必须通过Python发送此请求。我希望这能在内置Python 2.5的OSX上运行。我不太熟悉Tcl/Tk
。
尝试 #1
如果我可以访问底层小部件,我就可以像这个问题中那样生成点击事件。但是,查看对话框源代码,我认为第48-50行的Tcl
调用是阻塞的。这是正确的假设吗?
尝试 #2
我想可能有一种方法可以直接通过root.tk.call
使用Tcl
命令。由于我使用的是Python2
,我认为底层的Tcl
是对tk_getOpenFile
的单个调用。我是否需要确保Tcl
解释器是线程化的?这里有任何Tcl/Tk
命令可以帮助我吗?
尝试 #3
我可以使用os.listdir
等从头开始实现文件选择(可能在与服务器来回通信的单独HTML页面中)。这将是非常痛苦的,但希望可以避免。
解决方案
基于A. Rodas下面的答案,我想出了以下解决方案:
import tkFileDialog
old_dialog = tkFileDialog.askopenfilename
try:
tkFileDialog.askopenfilename = lambda *args, **kw: filename
# First test dialog cancelled
filename = ''
method_that_calls_tk()
# run some assertions
# Next test a valid file name with valid contents
filename = self.VALID_FILENAME
method_that_calls_tk()
# run some assertions
# Now test a valid file name with invalid contents
filename = self.INVALID_CONTENTS_FILENAME
method_that_calls_tk()
# run some assertions
# Now test an invalid file name
filename = self.INVALID_FILENAME
method_that_calls_tk()
# run some assertions
finally:
tkFileDialog.askopenfilename = old_dialog
tkFileDialog
... - Donal Fellowsaskopenfile
函数。顺便问一下,您有没有链接或资源可以让我了解如何在X11上注入事件? - Felipe