2017-04-22 28 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引数を期待していますが、1つはそれに渡されません。これを修正するには、最初に関数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() 
+0

!完璧に動作します。どうもありがとうございます! – raymund

+0

あなたの歓迎とその場合は、私の答えを受け入れてください。 [私の質問に誰かが答えたときに何をすべきですか?_(http://stackoverflow.com/help/someone-answers) – martineau

+0

P.S.私はまた、あなたの他によくコーディングされたtkinterアプリケーションであなたを称賛したいと思っていました。 BTW、[New Mexico Tech](http://www.nmt.edu/)には、オンラインの[** _ Tkinter reference _ **](http://infohost.nmt.edu/tcc/help/pubs/tkinter/)があります。 web/index.html)が役に立つかもしれません。 – martineau

関連する問題