Как избавиться от ошибки «Невозможно освободить карту цветов, паллета все еще выбрана»? - PullRequest
0 голосов
/ 13 января 2019

Я работал над ошибками в скрипте Python для цветовых градиентов, но я получаю эту непонятную ошибку при закрытии консоли Python, которая говорит:

Unable to free colormap, pallette is still selected

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

В прошлом я пробовал много разных версий операторов if, математики и выполнения, но ничего не помогло исправить это.

import turtle, random, os
turtle.colormode(255)
turtle.bgcolor(0, 0, 0)
curX = 0
curY = 0
curZ = 0
while True:
    x = random.randint(0, 255)
    y = random.randint(0, 255)
    z = random.randint(0, 255)
    success = False
    XD = 0
    YD = 0
    ZD = 0
    while success == False:
        if curX < x:
            curX = curX + 1
        elif curX > x:
            curX = curX - 1

        if curY < y:
            curY = curY + 1
        elif curY > y:
            curY = curY - 1

        if curZ < z:
            curZ = curZ + 1
        elif curZ > z:
            curZ = curZ - 1

        turtle.bgcolor(curX, curY, curZ)
        os.system("cls")
        print(x),
        print(y),
        print(z)
        print(curX),
        print(curY),
        print(curZ)
        if curX == x:
            print("X")
            XD = 1
        if curY == y:
            print("Y")
            YD = 1
        if curZ == z:
            print("Z")
            ZD = 1

        if XD + YD + ZD == 3:
            success = True

Когда я закрываюсь из программы, я ожидаю, что она просто закроется без каких-либо ошибок, 100% времени, но время от времени будет появляться сообщение: «Невозможно освободить карту цветов, палитра все еще выбрана. "ошибка.

1 Ответ

0 голосов
/ 13 января 2019

В среде, управляемой событиями, мы не можем просто сделать while True: и ожидать, что все будет работать. Это эффективно блокирует некоторые события от запуска. Событие закрытия окна может быть сложным - тем более, что иногда черепаха не может его обработать, поэтому нам, возможно, придется опуститься до уровня tkinter, чтобы сделать это правильно.

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

from turtle import Screen
from random import randint
from os import system

screen = Screen()
screen.colormode(255)
screen.bgcolor(0, 0, 0)

curR = 0
curG = 0
curB = 0

running = True

def window_closing():
    global running
    running = False
    screen.ontimer(screen.bye, 500)

def switch_color_target():
    global curR, curG, curB

    r = randint(0, 255)
    g = randint(0, 255)
    b = randint(0, 255)

    success = False

    RD = False
    GD = False
    BD = False

    while running and not success:
        if curR < r:
            curR += 1
        elif curR > r:
            curR -= 1
        else:
            RD = True

        if curG < g:
            curG += 1
        elif curG > g:
            curG -= 1
        else:
            GD = True

        if curB < b:
            curB += 1
        elif curB > b:
            curB -= 1
        else:
            BD = True

        screen.bgcolor(curR, curG, curB)

        system("cls")

        print(r)
        print(g)
        print(b)

        success = RD and GD and BD

        if success:
            print("R")
            print("B")
            print("G")
        else:
            print(curR)
            print(curG)
            print(curB)

    if running:
        screen.ontimer(switch_color_target, 250)

switch_color_target()

canvas = screen.getcanvas()
root = canvas.winfo_toplevel()
root.protocol("WM_DELETE_WINDOW", window_closing)

screen.mainloop()

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

...