Экран Python / Tkinter перестает отображать обновления холста - PullRequest
0 голосов
/ 26 августа 2018

У меня есть программа, которая обновляет (полное воссоздание изображения, то есть поворот изображения), затем изменяет tkinter.canvas.image и затем вызывает canvas.updatestats (), чтобы вызвать изменения на экране.вызывается time.sleep (0,0001) и процесс повторяется.

Он работает идеально, пока указатель мыши не изменится на крошечный синий круг с более светлой полосой, обводящей синий круг.Если я перемещаю указатель мыши, круг перемещается соответственно.Возможно, через 30 секунд круг возвращается к указателю мыши, и экран мгновенно меняется на то, как он должен выглядеть через 30 секунд работы (в этот момент экран на 100% корректен в течение 30 секунд работы).Однако при появлении синего круга экран больше не обновляется.Я подозреваю, что возможная сборка мусора началась и заставляет tkinter работать правильно, но обновление экрана приостановлено.Чтобы это началось, требуется некоторое время, но это происходит часто.

Я попытался импортировать gc.И затем выполнил gc.disable (), но это не помогло.

Кто-нибудь знает наверняка, почему это происходит?

Есть ли способ остановить это?

Может ли моя программа определить, что происходит остановка обновления экрана, поэтому я могу приостановить обновления экрана до тех пор, пока это не будет сделано?

1 Ответ

0 голосов
/ 27 августа 2018

Это цикл, который выполняется при возникновении проблемы. Помните, что код работает и выдает правильный вывод, за исключением случаев, когда синий кружок заменяет указатель мыши в тот момент, когда код продолжает выполняться правильно, просто экран не обновляется в течение 30-секундной задержки и когда синий кружок окончательно исчезает чистый результат 30 секунд выполнения отображается. Нет, где в моем коде я могу изменить указатель мыши.

Это машина с Windows 10 и python 3.6.

    while (fx != tx or fy != ty):
        if fx == tx:
            dx = 0
        elif fx > tx:
            dx = -2 if fx != tx+1 else -1
        else:
            dx =  2 if fx != tx-1 else  1
        if fy == ty:
            dy = 0
        elif fy > ty:
            dy = -2 if fy != ty+1 else -1
        else:
            dy =  2 if fy != ty-1 else  1
        steps += 1
        if steps > 0:
            if sAngle != eAngle:
                if eAngle < sAngle: sAngle -= 2
                else:               sAngle += 2
                im = Image.new("RGBA",(int(tileHeight+tileWidth/2),int(tileHeight+tileWidth/2)))
                if til.direction == North or til.direction == South:
                    im.paste(til.dom.raw[til.direction],(int((tileHeight+tileWidth/2-tileWidth)/2),int(tileWidth/4)))
                else:
                    im.paste(til.dom.raw[til.direction],(int(tileWidth/4),int((tileHeight+tileWidth/2-tileWidth)/2)))
                im = im.rotate(sAngle)
                imm = ImageTk.PhotoImage(im)        
                CANVAS.delete(til.canvasID)
                tags.remove(til.canvasID)
                til.canvasID = CANVAS.create_image(fx,fy,anchor=tk.CENTER,image=imm)
                tags.append(til.canvasID)

        CANVAS.move(til.canvasID,dx,dy)
        fx += dx
        fy += dy
        CANVAS.update_idletasks()
        time.sleep(0.0000001)
...