在方法中调用Python Tkinter wait_window然后恢复该方法

时间:2011-07-12 17:50:46

标签: python tkinter

我有一个主窗口,通过以下代码行创建一个设置窗口(定义为顶级窗口)作为wait_window:

 main.wait_window( Setup_Panel.setup_panel(main) )

该设置窗口有一个方法将其变量写入文本文件,但是如果输入文件或输出目录变量为空,我将一个警告弹出窗口作为设置窗口的wait_window调用,该窗口也定义为顶层窗口。方法如下:


def write_to_directory_file(main):
    main.execute_command = True
    if (main.input_directory_location.get().strip() == ""):
         main.wait_window( Error_Box.WarningPopup(main, "Input File Missing") )
    elif (main.output_directory_location.get().strip() == ""):
         main.wait_window( Error_Box.WarningPopup(main, "Output Directory Missing") )
    if execute_command:
         directory_file = open("plink.dir", 'w')
         directory_file.write("input_file: " + main.input_directory_location.get() + "\n")
         directory_file.write("output_directory: " + main.output_directory_location.get()    + "\n")
         directory_file.write("output_file: " + main.output_file_name.get() + "\n")
         directory_file.write("hom_name: " + main.HOM_name.get() + "\n")
         enable_parent_window(main.parent_main)
         main.destroy()
    print "FLAG"

警告弹出窗口显示消息,两个按钮一个是Continue,另一个是Cancel。 如果按取消,将销毁警告弹出窗口并将main.execute_command设置为False,因此该方法将不会继续。如果你按下继续它应该销毁弹出窗口并将main.execute_command设置为true,这样该方法将继续并写入目录。我的问题是,当警告弹出窗口被销毁时,它不会立即返回到该方法。相反,它不会返回到那一点并打印“FLAG”,直到设置窗口也被销毁。

我如何编码它以便在警告弹出窗口被破坏后直接恢复方法,而不是在我销毁警告窗口和设置窗口之后?调用.mainloop()的唯一窗口是主面板窗口。

主面板定义为:main = Tkinter.Tk() 并调用main.mainloop()

设置面板定义为:setup_main = Tkinter.Toplevel()

警告弹出窗口定义为:warning_main = Tkinter.Toplevel()

任何帮助解决这个问题都将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:0)

我刚遇到一个问题,就像你描述的问题一样。子窗口出现并工作但是在子窗口关闭后调用它的函数没有恢复。但是,在父窗口也关闭之后,最终没有恢复的功能终于恢复了。

我发现,我不小心为wait_window()行设置了错误的参数。我编写了创建子窗口的函数名称,而不是子窗口自己的名称。

示例:

#some code before
def create_cw(self):
    self.cw = Toplevel()
#some other after

出了什么问题:

wait_window(self.create_cw)

在我的案例中解决方案是什么:

wait_window(self.cw)

我在搜索问题的解决方案时找到了您的问题。我希望我能提供帮助。

答案 1 :(得分:0)

我发现了这个老问题,因为我遇到了类似的问题。

根据我的发现,wait_window(w)等待ww.destroy()中被销毁,然后将正常的控制流程返回给程序。就我而言,我也实现了自己的对话窗口,但我并没有破坏窗口。可能是你的情况。

TL / DR:必须销毁wait_window()的窗口参数才能继续正常的控制流程。