2017-04-24 45 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。