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