如何在GUI中使用ValueError异常进行正确的递归

时间:2013-12-05 10:26:41

标签: python exception-handling

当我运行程序时,我从用户那里得到一个输入,然后将其分配给“dimensions”变量。输入只需要一个整数,我为一个ValueError引发一个异常,它起作用并告诉用户它不是一个整数。但是代码一直持续到“if”语句的下一行,其中变量维度现在需要为整数分配一个整数,并在控制台中读取错误,说“维度未分配” 我的问题是如何在引发异常时使其递归,因此在输入整数之前代码不会继续执行下一部分。 在控制台中工作时我可以通过再次调用函数使其递归,并且在这里我尝试再次调用funnction但这似乎没有帮助。

def grid_dimensions(self) :
    global dimensions

### Assigns the value entered by the user to a variable for grid dimensions.
    try :
        dimensions = int(self.dimension_entry_box.get())

    except ValueError :
        tkinter.messagebox.showinfo('Error:', 'Input is not an Integer!')
        self.new_game()

### checks if the dimensions entered by the user are within the specified values,
### maximum or minimum dimensions if true displays a message to the user. 
    if (dimensions < gomoku_grid.MIN_DIMENSIONS or dimensions > gomoku_grid.MAX_DIMENSIONS) :
        self.message_label['text'] = "Invalid Dimensions - must be 5-16"
        return  
    else :
        self.log_grid = Gum_Gum_Grid(dimensions)

游戏的另一部分当它试图通过接受来自用户的字符串(文件名)来加载我引发同样问题的IOError时,我需要它来显示消息但是没有做任何事情,直到它得到正确的文件名。

    except IOError : 
        tkinter.messagebox.showinfo('Error:', 'Filename not recognized')
        self.get_load_string()

2 个答案:

答案 0 :(得分:0)

在之后移动except 代码,如果出现异常,则不得发生这些代码。如果您阅读了您所写的内容,请说尝试一下,如果有的话会发现异常,然后执行if...else,无论如何:

def grid_dimensions(self) :
    global dimensions

    ### Assigns the value entered by the user to a variable for grid dimensions.
    try :
        dimensions = int(self.dimension_entry_box.get())


        ### checks if the dimensions entered by the user are within the specified values,
        ### maximum or minimum dimensions if true displays a message to the user. 
        if (dimensions < gomoku_grid.MIN_DIMENSIONS or dimensions > gomoku_grid.MAX_DIMENSIONS) :
            self.message_label['text'] = "Invalid Dimensions - must be 5-16"
            return  
        else :
            self.log_grid = Gum_Gum_Grid(dimensions)

    ### Note - Moved
    except ValueError :
        tkinter.messagebox.showinfo('Error:', 'Input is not an Integer!')
        self.new_game()

答案 1 :(得分:0)

假设self.dimension_entry_box.get()提示用户输入值,请尝试以下操作:

while True:
    try :
        dimensions = int(self.dimension_entry_box.get())
        break
    except ValueError :
        tkinter.messagebox.showinfo('Error:', 'Input is not an Integer!')

这也可以避免因无效输入而导致捕获ValueError