2013-03-06 3 views
1

Это, наверное, самый тупой вопрос, но я абсолютно не знаю, какое исключение я получаю, все, что я знаю, это то, что я получаю одно, а google не хочет дайте мне знать, почему.Как узнать, что мое необработанное исключение

Вот что он говорит:

Unhandled exception in thread started by <function draw at 0x02A403B0> 

И это то, что вызвало его, хотя было бы неплохо, если бы кто-то может сказать мне, что с моим плохим кодом, я бы тоже очень хотел, чтобы знайте, как я могу узнать себя в следующий раз, когда это произойдет, так как это происходит так много.

def draw(): 
    while True: 
     for x in range(0,10): 
      for y in range (0,10): 
       if (coord[x][y] == 0): 
        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="white") 
       if (coord[x][y] == 1): 
        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="red") 
       if (coord[x][y] == 2): 
        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="darkorange") 
    time.sleep(0.03) 
+1

Вы не можете запускать функции tkinter в потоке, отличном от потока, на котором выполняется 'mainloop'. –

+1

Я не вижу конца этому 'while True', и вы имели в виду, что сон будет внутри? – Endophage

+0

@BryanOakley Невозможно ли я постоянно обновлять прямоугольники таким образом, а также запускать mainloop? – Eykar

ответ

3

Для отладки только, я бы вложить все это в try-except печати исключения и повторно поднять его:

def draw(): 
    try: 
     while True: 
      for x in range(0,10): 
       for y in range (0,10): 
        if (coord[i][j] == 0): 
         canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="white") 
        if (coord[i][j] == 1): 
         canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="red") 
        if (coord[i][j] == 2): 
         canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="darkorange") 
     time.sleep(0.03) 
    except Exception as e: 
     print(e) 
     raise 
+0

Спасибо! Это отлично: D Оказывается, исключение № 1 заключалось в том, что я использовал команду [i] [j], когда я использовал x и y. упс. – Eykar

0

объекты Tkinter не могут быть вызваны из любого другого потока, чем один где работает mainloop. Вместо этого вы должны удалить использование потоков и удалить использование бесконечного цикла. Вместо этого, сделать что-то вроде этого (хотя, я не знаю, где я и J приходят из, я просто скопировать код ...):

def draw(): 
    for x in range(0,10): 
     for y in range (0,10): 
      item = canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, 
              (x * 40) + 50, (y * 40) + 50) 
      if (coord[i][j] == 0): 
       canvas.itemconfig(item, fill="white") 
      if (coord[i][j] == 1): 
       canvas.itemconfig(item, fill="red") 
      if (coord[i][j] == 2): 
       canvas.itemconfig(item, fill="darkorange") 
    canvas.after(30, draw) 

Это использует тот факт, что вы уже имеют бесконечный цикл - цикл событий. Каждая итерация цикла события (или, точнее, каждые 30 миллисекунд в цикле событий) вы вызываете draw.

Этот код выглядит, как будто это будет реальная память. Вы действительно собираетесь продолжать создавать новые прямоугольники каждые 30 миллисекунд? В конце концов у вас будут проблемы с производительностью, так как вы получите сотни тысяч перекрывающихся прямоугольников.

+0

i и j являются ошибками, я хотел использовать x и y, так как я имел дело с координатами, а i и j в списке координат являются привычкой. И да, я просто оставил его случайно в течение нескольких минут, и мой компьютер был недоволен этим, я не знал о canvas.itemconfig(), прежде чем я угадал, после того как я создаю все 100 прямоугольников Я могу использовать это, чтобы просто изменить цвета. Я должен спать сейчас, я попробую это завтра :) – Eykar

+0

ОК, я только что обошел это, почему это более эффективно, чем предыдущий метод?Разве он не создает 100 прямоугольников каждые 30 миллисекунд. – Eykar

+0

@ Eykar: да, он все равно создает все эти прямоугольники. Дело было в том, чтобы проиллюстрировать правильный способ сделать интервалы, не заставляя графический интерфейс спать. Я не знал, нужно ли создавать все эти прямоугольники или нет. –

Смежные вопросы