[英]Tkinter Entry textvariable not working after call to filedialog.askopenfilename
我使用 Tkinter 有时会在我的应用程序中显示一个对话框。 对话框关闭后,我销毁并退出 Tkinter(顶层小部件),因为我不知道稍后是否会打开另一个对话框。 但是,如果我在open_file_dialog
之后调用open_simple_value_dialog
, open_simple_value_dialog
会显示一个空输入字段而不是默认值。 如果值被更改并确认(单击Ok
按钮),对话框返回的结果仍然是默认值。 如果未在其之前调用open_file_dialog
,则open_simple_value_dialog
确实按预期工作(显示默认值并返回输入的值)。 如何解决这个问题?
def open_file_dialog():
from tkinter import Tk, filedialog
root = Tk()
root.withdraw()
file_name = filedialog.askopenfilename(title='Select input file')
root.quit()
return file_name
def open_simple_value_dialog(default_input_value):
from tkinter import Tk, IntVar, StringVar, Label, Entry, Button
root = Tk()
if isinstance(default_input_value, str):
input_variable = StringVar()
elif isinstance(default_input_value, int):
input_variable = IntVar()
else:
raise ValueError('expected string or integer as default input value')
input_variable.set(default_input_value)
result = None
def close_dialog():
nonlocal root
root.destroy()
root.quit()
def on_ok():
nonlocal result
result = input_variable.get()
close_dialog()
Label(root, text='enter something').pack()
Entry(root, textvariable=input_variable).pack()
Button(root, text='Ok', command=on_ok).pack()
Button(root, text='Cancel', command=close_dialog).pack()
root.mainloop()
return result
def main():
print(open_file_dialog())
print(open_simple_value_dialog('text'))
value = open_simple_value_dialog(0)
if isinstance(value, int):
print(value)
else:
print('Dialog has been canceled')
if __name__ == '__main__':
main()
由于您在open_file_dialog()
中使用root.quit()
) ,它只会终止 tkinter .mainloop()
,但不会终止底层的 TCL 解释器和 tkinter 小部件(请参阅此问题中的解释)。 因此,当执行open_simple_value_dialog()
) 时, Tk()
的多个实例仍然存在问题。
您需要在open_file_dialog()
中使用root.destroy()
) 来代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.