Tkinter在python 3.6中给出以下错误:TclError:NULL主窗口

时间:2018-11-27 13:40:35

标签: python python-3.x tkinter tk

我正在编写一个执行以下序列的python程序:
1.打开/选择目录的对话框
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为主要窗口确实很不错,但是我似乎找不到我犯错的地方。 对于我在这里尝试做的事情,还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:0)

就像@CommonSense提到的那样,当您使用撤消隐藏主窗口时,则需要使用方法deiconify再次使用根。因此,如下更改函数change_directory

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

如果不取消图标化窗口,则无法调用使用根窗口的函数input_name

我已经测试了此代码,并且可以正常工作。

PS:close_window函数中还有一个错字(销毁窗口时)。

答案 1 :(得分:0)

按照@CommonSense的真实说法,您对.destroy().quit()的使用似乎并不是很周密。

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

您还应该控制通过事件调用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>