Анимация GUI с помощью Python (Dice Generator) - PullRequest
0 голосов
/ 29 февраля 2020

Я создаю простой генератор Dice, используя Breezy PythonGUI. Я заставил все это работать, но теперь я пытаюсь создать анимацию roll или flipping перед игрой в кости roll . Скорее всего, вы поймете, что я пытаюсь сделать, прочитав функцию generate .

'''Dice rolling generator'''

import random
from breezypythongui import EasyFrame
import time
from tkinter import PhotoImage
#from tkinter.font import Font

class DiceGenerator(EasyFrame):
    def __init__(self):
        EasyFrame.__init__(self, "Dice Generator")
        self.setResizable(True)
        self.setBackground('#6D8DB9')
        self.addLabel(text = 'Dice Generator', row = 0,
                      column = 0, columnspan = 2, background = '#6D8DB9')
        self.die1 = self.addLabel(text = '-', row = 1,
                      column = 0, sticky = 'E',
                      foreground = '#FFFFFF', background = '#6D8DB9')
        self.die2 = self.addLabel(text = '-', row = 1,
                      column = 1, sticky = 'W',
                      foreground = '#FFFFFF', background = '#6D8DB9')
        self.image1 = PhotoImage(file = 'd6.png')
        self.image2 = PhotoImage(file = 'd6.png')
        self.die1["image"] = self.image1
        self.die2["image"] = self.image2

#        self.die1.configure(font = 14)
#        self.die2.configure(font = 14)
        self.generate = self.addButton(text = 'Go!', row = 2,
                                       column = 0, columnspan = 2,
                                       command = self.generate)
        self.generate.configure(width = 10)

    def generate(self):
        'This is where I am attempting the animation'

        for i in range(20):
            x1 = random.randint(1, 6)
            y1 = random.randint(1, 6)
            time.sleep(.1)
            self.image1.configure(file = 'd' + str(x1) + '.png')
            self.image2.configure(file = 'd' + str(y1) + '.png')

        'The final rolled dice correctly display after this following code.'
        x = random.randint(1, 6)
        y = random.randint(1, 6)

        self.image1.configure(file = 'd' + str(x) + '.png')
        self.image2.configure(file = 'd' + str(y) + '.png')


def main():
    DiceGenerator().mainloop()

if __name__ == '__main__':
    main()

Когда я запускаю функцию generate(), она приостанавливается на время сна 20 (из-за range(20)), а затем отображает брошенные кости. Вместо того, чтобы проходить анимацию, она просто действует как замороженная.

Что мне делать, чтобы создать эту анимацию?

1 Ответ

0 голосов
/ 29 февраля 2020

Поскольку tkinter не берет на себя управление в течение l oop, изменения не могут быть обновлены. Добавьте self.update() в конце блока для l oop для принудительного обновления:

for i in range(20):
    ...
    self.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...