обновление холста в бегущем процессе

master = Tk()

canvas_width = 100
canvas_height = 250
w = Canvas(master, 
           width=canvas_width,
           height=canvas_height)
w.pack()

class Tetriminos(object):

    def __init__(self, position, pivot, color):
        self.position = position
        self.pivot = pivot
        self.color = color

    def left_shift(self):
        backup = copy.copy(self.position) 
        for i in range(len(self.position)):
            change = str(int(self.position[i][0]) - 1) + self.position[i][1:]
            if "-" in change:
                self.position = backup
                return False
            for j in self.position:
                if "0" in self.position:
                    self.position = backup
                    return False
            self.position[i] = change
        self.pivot[0] -=1

    def right_shift(self):
        backup = copy.copy(self.position)
        for i in range(len(self.position)):
            change = str(int(self.position[i][0]) + 1) + self.position[i][1:]
            if "0" in change:
                self.position = backup
                return False
            self.position[i] = change
        self.pivot[0] += 1

    def rotate(self): #direction?
        for i in range(len(self.position)):
            a = int(self.position[i][0]) - self.pivot[0]
            b = int(self.position[i][1:]) - self.pivot[1]
            a, b = a*0 + b*(-1), a*1 + b*0
            a += self.pivot[0]
            b += self.pivot[1]
            if a >= 0 and b >= 0:
                self.position[i] = str(a) + str(b)
            else:
                pass

    def drop(self):
        pass

    def slow_drop(self):
        for i in range(len(self.position)):
            change = self.position[i][0] + str(int(self.position[i][1:]) + 1)
            if int(change[1:]) < 26: #and no other tetrimino is in the way...
                self.position[i] = change
            else:
                return False
        self.pivot[1] += 1

    def draw(self):
        for i in range(len(self.position)):
            a = int(self.position[i][0])*10
            b = (int(self.position[i][1:])-1)*10 #Das Koordinatensystem ist gedreht!!
            c = (int(self.position[i][0])+1)*10
            d = (int(self.position[i][1:]))*10

            w.create_rectangle(a, b, c, d, fill=self.color)
            w.create_rectangle(a, b, c, d, fill=self.color)
            w.create_rectangle(a, b, c, d, fill=self.color)
            w.create_rectangle(a, b, c, d, fill=self.color)


tetrimino1 = Tetriminos(["302", "402", "502", "602"], [4, 2], "green")

tetrimino2 = Tetriminos(["402", "502", "401", "501"], [5, 1], "grey")

tetrimino3 = Tetriminos(["302", "402", "502", "401"], [4.5, 1.5], "yellow")

tetrimino4 = Tetriminos(["302", "402", "502", "301"], [4.5, 1.5], "blue")

tetrimino5 = Tetriminos(["302", "402", "502", "501"], [4.5, 1.5], "red")

tetrimino6 = Tetriminos(["302", "402", "401", "501"], [4, 1], "white")

tetrimino7 = Tetriminos(["402", "502", "301", "401"], [5, 1], "orange")

tetrimino_list = [tetrimino1, tetrimino2, tetrimino3, tetrimino4,tetrimino5,
              tetrimino6, tetrimino7]

settled_tetriminos = []

def draw():
    w.delete(ALL)
    current.draw()
    for t in settled_tetriminos:
        t.draw
        w.update_idletasks()
    time.sleep(0.1)
    current.slow_drop()
    print(current.position)
    if int(current.position[1][1:]) == 25:
        w.delete(ALL)
        current.draw()
        w.update_idletasks()
        settled_tetriminos.append(current)
        return False
    w.delete(ALL)
    current.draw()
    for t in settled_tetriminos:
        t.draw
    w.update_idletasks() 
    w.after(100, draw)

current = random.choice(tetrimino_list)
draw()

class App:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        self.button = Button(frame, 
                         text="Left", fg="red",
                         command=self.left())
        self.button.pack(side=LEFT)
        self.button2 = Button(frame,
                         text="Right", fg="red",
                         command=self.right())
        self.button2.pack(side=RIGHT)
    def left(self):
        print("dsdsd")
        current.left_shift()
        current.draw()
    def right(self):
        print("ffff")
        current.right_shift()
        current.draw()

mainloop()

Хорошо, это вид работ теперь. Но только для одной части. если я использую какой-либо цикл с условием продолжения или рекурсивную функцию, он не делает, как вы сказали. Но как я мог избежать петель, если я хочу получить новый tetriminos каждый раз, недавний улажен? Если я использую рекурсию, иначе, она работает внутренне, но не обнаруживается на холсте.

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

0
nl ja de
You' ре, не звоня update_idletasks : вы должны w.update_idletasks() - Не уверенный если that' ll фиксируют его все же.
добавлено автор mgilson, источник
update_idletasks doesn' t определенно обновляют холст; скорее это управляет любыми задачами "без работы". Перекрашивания экрана считают задачей без работы.
добавлено автор Bryan Oakley, источник

1 ответы

Трудно сказать наверняка, что продолжается, потому что код, который вы опубликовали, пропускает некоторые важные части кода.

Однако однако, логика выглядит очень странной. Например, <у кода> drawdraw есть бесконечный цикл, который вы никогда не должны иметь в GUI. drawdraw требования рисуют , и рисуют требования drawdraw , что означает, что возможно управлять бесконечным циклом в бесконечном цикле.

Кажется вероятным, что вы настроили ситуацию, где система никогда не получает шанс потянуть себя.

Лучшее решение состоит в том, чтобы удалить ваш бесконечный цикл и удалить рекурсию. Ни один из тех не необходим, чтобы сделать анимацию в Tkinter.

0
добавлено
@Bö rjeSchweizer: ваш код, кажется, работает на меня - все части понижаются. Однако все Tetriminos друг на друге, таким образом, вы только видите самый верхний. Кроме того, у вас действительно есть, по крайней мере, еще одна ошибка - у вас есть линия, которая говорит t.draw , и это должно быть t.draw() . Наконец, можно безопасно удалить все требования update_idletasks , они абсолютно ненужные.
добавлено автор Bryan Oakley, источник
Я обновил свой код теперь. возможно, у вас есть идея:)
добавлено автор Börje Schweizer, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community