关闭窗口后如何保存数据?

时间:2019-03-26 18:11:43

标签: python tkinter

我正在尝试使用Python3tkinter上制作一些GUI。到目前为止,我上面有主窗口'Test'按钮,它将打开第二个窗口。第二个窗口具有输入,标签,保存和关闭按钮。当您在输入项中键入内容并按save按钮时,标签会显示您在输入项中键入的文本。但是关闭此窗口并再次打开后,标签什么也没有显示。如何制作此标签以显示关闭前上次键入的文本?例如,我在输入中键入“ Hi”,然后按“ Save”,然后按“ Close”,然后再次打开此窗口,标签显示为“ Hi”。 '

import tkinter as tk

def save_data(entry, t):
    t.config(text = entry.get())

def close_action(current_window):
    current_window.destroy()

def insertMainInfo():
    new_window = tk.Tk()
    new_window.geometry("307x131")
    new_window.title("TestWindow")

    test_entry = tk.Entry(new_window)
    test_entry.place(relx = 0.283, rely = 0.1, height = 24, width = 127)

    text = tk.Label(new_window)
    text.place(relx = 0.283, rely = 0.25, height = 24, width = 127)

    save_button = tk.Button(new_window, command = lambda: save_data(test_entry, text))
    save_button.place(relx=0.283, rely=0.45, height=24, width=127)
    save_button.configure(text = "Save")

    close = tk.Button(new_window, command = lambda: close_action(new_window))
    close.place(relx=0.283, rely=0.687, height=24, width=127)
    close.configure(text = "Close")

    new_window.mainloop()

if __name__ == '__main__':

    top = tk.Tk()
    top.geometry("307x131+557+330")
    top.resizable(width=False, height=False)
    top.title("MainWindow")

    new_window_button = tk.Button(top, command = insertMainInfo)
    new_window_button.place(relx=0.283, rely=0.687, height=24, width=127)
    new_window_button.configure(text = "Test")

    main_label = tk.Label(top)
    main_label.place(relx=0.033, rely=0.153, height=41, width=284)
    main_label.configure(text = "TestLabel")

    top.mainloop()

1 个答案:

答案 0 :(得分:1)

我不得不承认,您的问题标题有点模棱两可。 如果您只想更新最后一个条目的标签,则这里提供了一种修改代码的简单方法。

根据建议,在一个好的程序中,我们的程序中只有一个Tk(),其他新窗口或弹出窗口应使用Toplevel()类的tkinter;因此,我在您的 insertMainInfo() 函数中使用了此功能。

这里的重点是定义一个变量,我叫 last_entry ,最初是空的或“’”。在主程序的 new_window 按钮(在 if __name__ == '__main__': 之后)中将此参数用作此变量的参数(我也在此处添加了lambda函数)。

然后我们在 save_data 函数中将其定义为全局变量,这样以后其他函数或主程序就可以将其称为 new_window之前的最后一个条目已关闭。

在这里,我如上所述修改了您的代码,并且已经对其进行了测试,并且可以正常工作。

import tkinter as tk

def save_data(entry, t):
    global last_entry
    last_entry = entry.get()
    t.config(text = last_entry)

def close_action(current_window):
    current_window.destroy()

def insertMainInfo(last_entry):
    new_window = tk.Toplevel()
    new_window.geometry("307x131")
    new_window.title("TestWindow")

    test_entry = tk.Entry(new_window)
    test_entry.place(relx = 0.283, rely = 0.1, height = 24, width = 127)

    text = tk.Label(new_window, text=last_entry)
    text.place(relx = 0.283, rely = 0.25, height = 24, width = 127)

    save_button = tk.Button(new_window, command = lambda: save_data(test_entry, text))
    save_button.place(relx=0.283, rely=0.45, height=24, width=127)
    save_button.configure(text = "Save")

    close = tk.Button(new_window, command = lambda: close_action(new_window))
    close.place(relx=0.283, rely=0.687, height=24, width=127)
    close.configure(text = "Close")

    new_window.mainloop()
    
# --- A Simple Data Structure ---
last_entry = ''


if __name__ == '__main__':

    top = tk.Tk()
    top.geometry("307x131+557+330")
    top.resizable(width=False, height=False)
    top.title("MainWindow")

    new_window_button = tk.Button(top, command = lambda: insertMainInfo(last_entry))
    new_window_button.place(relx=0.283, rely=0.687, height=24, width=127)
    new_window_button.configure(text = "Test")

    main_label = tk.Label(top)
    main_label.place(relx=0.033, rely=0.153, height=41, width=284)
    main_label.configure(text = "TestLabel")
    
    top.mainloop()