2017-07-14 16 views
-1

私はtkinterエントリーウィジェットに数字だけを許可する検証を追加しました。私はリフレッシュと再開の機能を有効にするためにエントリーウィジェットを空にできると思ったコードを追加しました。バリデーション防止リフレッシュ/再起動防止 - tkinter

再起動ボタンまたは参照ボタンが押されたとき、エントリウィジェットとテキストエリアの両方をクリアしたいと思っています。現在、テキスト領域のみがクリアされています。数字は入力ウィジェットに残ります。私のコードへの提案された改正は認められるでしょう。

def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 
    self.controller = controller 
    ... 
    vcmd = (self.register(self.onValidate), '%S') 
    self.weight_entry = tk.Entry(self, validate='key', vcmd = vcmd) 
    self.weight_entry.pack(pady = 10) 
    self.text = tk.Text(self) 
    self.text.pack(pady = 10) 
    self.text.config(state='disabled') 
    Restart_button = tk.Button(self, text="Restart", command=self.restart) 
    Refresh_button = tk.Button(self, text="Refresh", command=self.refresh) 
    ... 


# Code below adds validation to the Entry widget so only numbers can be entered 
def onValidate(self,s): 
    if (self.weight_entry ==""):"""Not sure if this is correct. Taken from another answer on SO.""" 
     return True 
    if s in ['0','1','2', '3', '4', '5', '6', '7', '8', '9']: 
     return True 
    else: 
     self.bell() # adds a sound effect to error 
     self.text.delete(1.0, tk.END) # deletes the error message if valid entry provided 
     return False 

def restart(self): 
    self.refresh() 
    self.controller.show_frame("StartPage") 

def refresh(self): 
    self.weight_entry.delete(0,tk.END) 
    self.text.config(state='normal') 
    self.text.delete("1.0", "end") 
    self.text.config(state='disabled') 

答えて

1

あなたはonValidateにあなたはsは一桁であることを期待しているため、エントリの全体の内容が削除できない理由が、あなたのエントリには、「123」を含んでいる場合、あなたはdelete(0, "end")を呼び出し、その後、s = ' 123 'だからonValidateはFalseを返します。この問題を解決するには

、あなたが行うことができます:

def onValidate(self, s): 
    if s.isdigit(): # no need to test if the entry is empty because the deleted text contains only digits 
     return True 
    else: 
     self.bell() # adds a sound effect to error 
     self.text.delete(1.0, tk.END) # deletes the error message if valid entry provided 
     return False