【问题标题】:Animating a GUI with Python (Dice Generator)使用 Python(骰子生成器)为 GUI 制作动画
【发布时间】:2020-02-29 08:23:57
【问题描述】:

我正在使用 BreezyPythonGUI 创建一个简单的 Dice 生成器。我得到了整个工作,但现在我试图在骰子 roll 之前创建 rollingflipping 动画。通过阅读 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)),然后显示掷出的骰子。它没有通过动画,而是像被冻结一样。

如何制作这个动画?

【问题讨论】:

  • 与 for 循环一样,tkinter mainloop 不会控制更新更改。在 for 循环块的末尾添加 self.update() 以强制更新。
  • 首先你要了解Event-driven programming
  • 一般来说,你不应该在 tkinter 应用程序中调用time.sleep()。您应该改用通用小部件after() 方法来安排对更新图像的函数的调用。如果您寻找它们,这里有很多关于 tkinter 动画的相关问题的例子。

标签: python class animation tkinter time


【解决方案1】:

由于 tkinter 在 for 循环期间不进行控制,因此无法更新更改。在for循环块末尾添加self.update(),强制更新:

for i in range(20):
    ...
    self.update()

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 2013-03-17
    • 2012-04-25
    • 2013-07-19
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多