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>
我正在编写一个 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>