繁体   English   中英

Tkinter 调用 filedialog.askopenfilename 后条目文本变量不起作用

[英]Tkinter Entry textvariable not working after call to filedialog.askopenfilename

我使用 Tkinter 有时会在我的应用程序中显示一个对话框。 对话框关闭后,我销毁并退出 Tkinter(顶层小部件),因为我不知道稍后是否会打开另一个对话框。 但是,如果我在open_file_dialog之后调用open_simple_value_dialogopen_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM