如何将 tkinter OptionMenu 和 Entry 小部件的内容保存到文件中?

How to save tkinter OptionMenu & Entry widgets' contents to a file?

我正在尝试将来自选项菜单小部件和条目小部件的用户输入保存到文件中,问题是条目小部件中的用户输入未正确保存。下面是我的代码。

from tkinter import *                                                 

class ComputeTax:

    def __init__(self, master):

        self.compute_tax_frame = Frame(master)
        self.compute_tax_frame.pack()

        self.tax_status_label = Label(self.compute_tax_frame, text="input tax      status:")
        self.tax_status_label.grid(row=0, column=0, sticky=E)
        self.status_option = StringVar(self.compute_tax_frame)
        self.status_option.set("S")
        self.tax_status_option = OptionMenu(self.compute_tax_frame,
                                            self.status_option, "S", "M", "M1", "M2", "M3", "M4",
                                            command=self.save_ts)
        self.tax_status_option.grid(row=0, column=1, sticky=W)

        self.monthly_salary_label = Label(self.compute_tax_frame, text="input    monthly pay:")
        self.monthly_salary_label.grid(row=1, column=0, sticky=E)
        self.salary_input = StringVar(self.compute_tax_frame)
        self.salary_input.set("0.00")
        self.monthly_salary_input = Entry(self.compute_tax_frame,
                                          textvariable=self.salary_input)
        self.monthly_salary_input.grid(row=1, column=1)

        self.calculate_button = Button(self.compute_tax_frame, text="Save &     Calculate now!")
        self.calculate_button.grid(row=3, columnspan=2)

    def save_ts(self, value):

        tax = value
        pay = self.salary_input.get()

        with open("monthly_net_pay", "w") as file:
            file.write("{}\n".format(tax))
            file.write("{}\n".format(pay))
            file.close()

frame = Tk()
a_compute_class = ComputeTax(frame)
frame.title("Monthly Tax & Net Pay Computation")
frame.mainloop()

我发现您的代码存在一些问题。主要的是 OptionMenu 小部件没有 command option/argument,所以 command=self.save_ts 没有完成任何事情(我有点惊讶没有例外因您试图指定它而引发。)

解决此问题的方法是在创建 calculate_button.

时使用提供它

第二个是 save_ts() 函数需要一个 value 参数,但不会将其传递给它。要更正此问题,请先从函数 def 中删除参数,然后从您命名为 status_option.

Stringvar 小部件中获取所需的值

这是您的代码,其中应用了建议的修复:

from tkinter import *

class ComputeTax:
    def __init__(self, master):
        self.compute_tax_frame = Frame(master)
        self.compute_tax_frame.pack()

        self.tax_status_label = Label(self.compute_tax_frame, 
                                      text="input tax status:")
        self.tax_status_label.grid(row=0, column=0, sticky=E)
        self.status_option = StringVar(self.compute_tax_frame)
        self.status_option.set("S")
        self.tax_status_option = OptionMenu(self.compute_tax_frame,
                                            self.status_option,
                                            "S", "M", "M1", "M2", "M3", "M4")
        self.tax_status_option.grid(row=0, column=1, sticky=W)

        self.monthly_salary_label = Label(self.compute_tax_frame,
                                          text="input monthly pay:")
        self.monthly_salary_label.grid(row=1, column=0, sticky=E)
        self.salary_input = StringVar(self.compute_tax_frame)
        self.salary_input.set("0.00")
        self.monthly_salary_input = Entry(self.compute_tax_frame,
                                          textvariable=self.salary_input)
        self.monthly_salary_input.grid(row=1, column=1)

        self.calculate_button = Button(self.compute_tax_frame,
                                       text="Save & Calculate now!",
                                       command=self.save_ts)
        self.calculate_button.grid(row=3, columnspan=2)

    def save_ts(self):
        tax = self.status_option.get()
        pay = self.salary_input.get()
        with open("monthly_net_pay", "w") as file:
            file.write("{}\n".format(tax))
            file.write("{}\n".format(pay))
#            file.close()  # automatic when using `with`

frame = Tk()
a_compute_class = ComputeTax(frame)
frame.title("Monthly Tax & Net Pay Computation")
frame.mainloop()