Tkinter gives following error in python 3.6: TclError: NULL main Window

Tkinter gives following error in python 3.6: TclError: NULL main Window

我正在编写一个 python 程序来执行以下序列:
1.对话框到open/select一个目录
2.执行某些操作
3. 使用 tkinter 对话框重命名文件
4. 执行其余操作

我写了下面的代码:

def open_directory():
    directory_name = filedialog.askdirectory(title='Ordner Auswählen',parent=root)
    print(directory_name)
    root.destroy()

def input_name():
    def callback():
        print(e.get())
        root.quit()
    e = ttk.Entry(root)
    NORM_FONT = ("Helvetica", 10)
    label = ttk.Label(root,text='Enter the name of the ROI', font=NORM_FONT)
    label.pack(side="top", fill="x", pady=10)
    e.pack(side = 'top',padx = 10, pady = 10)
    e.focus_set()
    b = ttk.Button(root, text = "OK", width = 10, command = callback)
    b.pack()

def close_window():
    root.destory()

root = tk.Tk()
root.withdraw()
open_directory()  #dialogue box to select directory
<perform certain operations>
input_name()  #dialgue box for user input file name
root.mainloop()
close_window() #exit the mainloop of tkinter
<perform rest of the functions>

但是我收到以下错误 Tclerror: NULL main window 我认为将 root 声明为主 window 是真实的,但我似乎没有找到我在哪里犯了错误。 对于我在这里尝试做的事情,还有其他更好的方法吗?

正如@CommonSense 提到的,当你使用withdraw 隐藏main window 时,你需要使用方法deiconify 再次使用root。因此,改变函数 change_directory 如下:

def open_directory():
    directory_name = filedialog.askdirectory(title='Ordner Auswählen',parent=root)
    print(directory_name)
    root.deiconify()

如果不去图标化 window,则无法调用使用根 window.

的函数 input_name

我已经测试了这段代码并且它有效。

PS: 你在函数 close_window 中也有错别字(当破坏 window 时)。

正如@CommonSense 所说,您对 .destroy().quit() 的使用似乎并没有很好地计划。

不仅如此,您需要使用触发器或事件来控制您的函数调用,否则它们只是 运行 直接阻止另一个 运行ning 就像您的代码中的情况一样.

您还应该控制何时使用事件调用 close_window()

from tkinter import filedialog
import tkinter as tk
def open_directory():
    directory_name = filedialog.askdirectory(title='Ordner Auswählen',parent=root)
    print(directory_name)
    #root.destroy()
    input_name()

def input_name():
    def callback():
        print(e.get())
        #root.quit()
    es_variable=tk.StringVar()
    e = tk.Entry(root, textvariable=es_variable)
    NORM_FONT = ("Helvetica", 10)
    label = tk.Label(root,text='Enter the name of the ROI', font=NORM_FONT)
    label.pack(side="top", fill="x", pady=10)
    e.pack(side = 'top',padx = 10, pady = 10)
    e.focus_set()
    b = tk.Button(root, text = "OK", width = 10, command = callback)
    b.pack()

def close_window():
    root.destory()

root = tk.Tk()
#root.withdraw()
open_dir_button = tk.Button(root, text = "Open Dialog", width = 10, command =open_directory)
open_dir_button.pack()
#dialogue box to select directory
#<perform certain operations>
#dialgue box for user input file name
root.mainloop()
#close_window() #exit the mainloop of tkinter
#<perform rest of the functions>