2017-04-22 75 views
1

我试图从一个选项菜单小部件和一个文件上的条目小部件保存用户输入,问题是用户输入的条目小部件没有正确保存。下面是我的代码。如何将tkinter OptionMenu&Entry小部件的内容保存到文件中?

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() 

回答

1

我看到你的代码有几个问题。其中主要的一个是OptionMenu部件没有command选项/参数,所以command=self.save_ts没有完成任何事情(我有点惊讶的是,没有出现异常,从你试图指定它提出。)

的解决这个问题的方法是在创建calculate_button时使用它。

第二个是save_ts()函数期望value参数,但不会传递给它。要解决该问题,请先从函数def中删除参数,然后从名为status_optionStringvar小部件中获取所需的值。

这里是你的代码应用了建议的修复:

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() 
+0

@马蒂诺哇!作品完美无瑕。非常感谢! – raymund

+0

您的欢迎,并在这种情况下,请接受我的答案。参见[_当有人回答我的问题时我应该怎么做?](http://stackoverflow.com/help/someone-answers) – martineau

+0

P.S.我也想在你的编码很好的tkinter应用程序上恭维你。顺便说一句,[新墨西哥科技](http://www.nmt.edu/)有一个很好的在线[** _ Tkinter参考_ **](http://infohost.nmt.edu/tcc/help/pubs/tkinter/ web/index.html)你可能会觉得有用。 – martineau

相关问题