2017-04-24 17 views
0

私はユーザーがカテゴリを選択し、料金を計算するための値を入力できるプログラムを作成しています。自分の検証ファイルを使ってテキスト入力を検証したいと思います。しかし、プログラムを実行してテキスト入力に何も入力しないと、エラーウィンドウは何度もポップアップし続けます。さらに、プログラムを実行して入力欄に有効な数値を入力すると、合計料金の計算が定義されていますが、料金は0.0になります。ここでtkinterのテキスト入力を検証する

は、プログラムは次のとおりです。ここで

import tkinter 
import tkinter.messagebox 
import ValidationFile 

validationObject = ValidationFile.ValidationClass() 

class MyGUI: 
    def __init__ (self): 
     self.main_window = tkinter.Tk() 

     self.top_frame = tkinter.Frame (self.main_window) 
     self.middle_frame = tkinter.Frame (self.main_window) 
     self.bottom_frame = tkinter.Frame (self.main_window) 

     self.phone_var = tkinter.IntVar() 

     self.phone_var.set (1) 

     self.pb1 = tkinter.Radiobutton (self.top_frame, \ 
        text = 'Daytime (6:00 AM - 5:59 PM)', variable = self.phone_var, \ 
        value = 0.12) 
     self.pb2 = tkinter.Radiobutton (self.top_frame, \ 
        text = 'Evening (6:00 PM - 11:59 PM)', variable = self.phone_var, \ 
        value = 0.07) 
     self.pb3 = tkinter.Radiobutton (self.top_frame, \ 
        text = 'Off-Peak (Midnight - 5:50 AM)', variable = self.phone_var, \ 
        value = 0.05) 

     #pack phone buttons 
     self.pb1.pack() 
     self.pb2.pack() 
     self.pb3.pack() 

     #create input and output buttons 
     self.txtInput = tkinter.Entry (self.middle_frame, \ 
             width = 10) 
     self.value = tkinter.StringVar() 

     self.lblOutput = tkinter.Label (self.middle_frame, \ 
             width = 10, textvariable = self.value) 

     self.txtInput.pack() 
     self.lblOutput.pack() 

     #create OK buton and QUIT button 
     self.ok_button = tkinter.Button (self.bottom_frame, \ 
         text = 'OK', command = self.show_choice) 
     self.quit_button = tkinter.Button (self.bottom_frame, \ 
         text = 'QUIT', command = self.main_window.destroy) 

     #pack the buttons 
     self.ok_button.pack (side = 'left') 
     self.quit_button.pack (side = 'left') 

     #pack the frames 
     self.top_frame.pack() 
     self.middle_frame.pack() 
     self.bottom_frame.pack() 

     #start the mainloop 
     tkinter.mainloop() 


    def show_choice (self): 
     choice = self.phone_var.get() 
     value = -1 
     while value == -1: 
      valueEntry = self.txtInput.get() 
      if valueEntry == '': 
       value = -1 
       tkinter.messagebox.showinfo (title = 'ERROR', \ 
              message = 'Please enter a valid number.') 
      else: 
       value = validationObject.checkFloat (valueEntry) 

     total = choice * value 
     self.value.set (total) 

#create instance of MyGUI class 
my_GUI = MyGUI() 

は、検証ファイルです:

#create validation class 
class ValidationClass: 

    def checkFloat (self, inputString): 

     try: 
      result = float (inputString) 
     except Exception: 
      return -1 

     if result < 0: 
      return -1 
     else: 
      return result 

    def checkInteger (self, inputString): 

     try: 
      result = int (inputString) 
     except Exception: 
      return -1 

     if result < 0: 
      return -1 
     else: 
      return result 

答えて

1

あなたはwhile value == -1:で無限ループを作りました。そのループのどこにいても、ユーザーが再試行できるように一時停止しています。あなたは別の問題を持っていることを修正したら

def show_choice (self): 
    valueEntry = self.txtInput.get() 
    value = validationObject.checkFloat(valueEntry) 
    if value == -1: 
     tkinter.messagebox.showinfo (title = 'ERROR', \ 
             message = 'Please enter a valid number.') 
    else: 
     choice = self.phone_var.get() 
     total = choice * value 
     self.value.set (total) 

:あなたは、すべてのループを必要としない、あなたのオプションで浮動小数点値を使用しますが、変数は整数のみを扱うことができるIntVar、です。したがって、「選択」は常に0になります。代わりにDoubleVarを使用する必要があります。

関連する問題