【发布时间】:2020-02-29 08:23:57
【问题描述】:
我正在使用 BreezyPythonGUI 创建一个简单的 Dice 生成器。我得到了整个工作,但现在我试图在骰子 roll 之前创建 rolling 或 flipping 动画。通过阅读 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