2016-08-01 3 views
-3

Этот код не будет продолжать после проверки того, является ли переменная x целым числом или нет. Он выдает ValueError, если x не является int. Как заставить программу игнорировать эту ошибку? Я попытался перевернуть заявление так:Если оператор не продолжается

elif x is isinstance(x, int): 

, но затем, если я дам ему целое, он немедленно переходит к утверждению другого.

from tkinter import * 

root = Tk() 

root.wm_title("InOut") 

root.geometry('500x500') 

greetings = ["hello", "Hello", "greetings", "Greetings"] 


def out(event): 

    x = ent.get() 
    if x in greetings: 
     lr.configure(text=x + ",\n is there\n anything\n I can do\n for you?") 
    elif x is isinstance(x, int): 
     if int(x) == 0: 
      lr.configure(text="This is 0") 
     elif int(x) % 2 == 0: 
      lr.configure(text="This is a even number") 
     elif int(x) % 2 != 0: 
      lr.configure(text="This is an odd number") 
    elif x is "": 
     lr.configure(text="Well") 
    else: 
     print("Closing") 
     root.destroy() 


ent = Entry(root) 
ent.grid(row=0, column=0, sticky=NW) 
lr = Label(root, text="Output") 
lr.grid(row=0, column=2, columnspan=2) 
btn = Button(root, text="Process") 
btn.grid(row=0, column=1, sticky=NW) 
btn.bind("<Button-1>", out) 

root.mainloop() 
+5

Удалить это x есть. Просто «isinstance (x, int)». Прямо сейчас вы спрашиваете, есть ли x (True или False), который всегда возвращает False. – James

+0

@James все еще не работает – birkenspanner

+1

Похоже, что вы можете дать ему строку, а не int? Если вам нужно передать его в int ниже оператора if, то это не было int в первую очередь - см. Мой ответ – James

ответ

3

Я думаю, что вы, возможно, пытается увидеть, если строка представляет собой целое число. Вместо этого, если заявление, я бы просто использовать Try/за исключением блока:

def is_int(x): 
    try: 
     x = int(x) 
     return True 
    except: 
     return False 

Помещенный, что в вашем коде и использовать его вместо вызова isinstance. Как и сейчас, даже если x было целым числом, прямо сейчас вы спрашиваете, есть ли x (True или False), который всегда будет возвращать False. Но если x - это строка, которая может быть преобразована в целое число, то isinstance (x, int) никогда не вернет True, даже если x можно преобразовать в int.

+1

Это правильный ответ, мой и другой адрес - синтаксическая ошибка, это фактически решает OP. +1 – Will

2

isinstance() возвращает логическое значение, поэтому вам не нужен дополнительный x. Идите прямо на

elif isinstance(x, int): 
+0

как-то все равно не работает для меня – birkenspanner

+0

Не могли бы вы рассказать немного больше, действительно ничего более, чем «Это не работает» –

+0

Когда я вводил что-то, он должен проверить, является ли это int. Если это так, нужно проверить, является ли это нечетным или четным числом. Но для меня он не проверяет его, он просто перескакивает прямо на оператор else, который закрывает программу – birkenspanner

3

Следующая строка не делает то, что вы думаете.

elif x is isinstance(x, int): 

isinstance собирается вернуться True/False в зависимости от типа данных x. Таким образом, заявление x is isinstance(x, int) всегда будет возвращать false, поскольку оно не может быть как int, так и bool.

Вы просто хотите:

elif isinstance(x, int): 
Смежные вопросы