2017-04-22 96 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

相關問題