在TKINTER中运行连续的动画集,并在两者之间进行中断



图形布局

嗨,我在这里的第一篇文章!我是第一次试图找出问题的编码员。任何帮助都将得到深深的赞赏。

我试图通过更改四个标签的背景颜色("眨眼"(来创建一个"动画"。因此,这个想法是要以一个顺序眨眼几次,然后暂停以获取用户输入。此动画用户输入周期重复几次。

我尝试使用后方法来执行此操作。但是,一切都没有依次进行动画,而是在最后,一切都聚在一起并一起奔跑。换句话说,如果我尝试执行连续的动画,那么第一次动画在进入下一个动画之前就不会执行

本节是生成动画序列的地方。

    self.genRandom(3)  # generate random sequence of numbers
    self.createSchedule(3) #relate the random sequence onto image on screen
    self.doanim() #execute animation 

    self.delay=10000  #delay before beginning next animation 
    self.after(self.delay, self.genRandom(3))
    self.after(self.delay, self.createSchedule(3))
    self.after(self.delay, self.doanim())

计划生成(将序列编号与图像相关((延迟,标签颜色更改功能(

def createSchedule(self,seqn):
    self.schedule.clear()
    tuple=(2000, self.labelbegin)
    self.schedule.append(tuple)
    #     (10, lambda: self.associateDigLogo())
    for number in self.listSeqn:
        #     (10, lambda: self.associateDigLogo()
        if number == 0:
            self.schedule.extend(((1000,lambda: self.buttonpresswhatsapp(None)), (500, lambda: self.buttonreleasewhatsapp(None))))
        elif number == 1:
            self.schedule.extend(((1000, lambda: self.buttonpressslack(None)), (500, lambda: self.buttonreleaseslack(None))))
        elif number == 2:
            self.schedule.extend(((1000, lambda: self.buttonpressskype(None)), (500, lambda: self.buttonreleaseskype(None))))
        elif number ==3:
            self.schedule.extend(((1000, lambda: self.buttonpresssnapchat(None)), (500, lambda: self.buttonreleasesnapchat(None))))

本节是执行动画的地方

def doanim(self):
    if len(self.schedule) <= 0:
        return
    self.sched_item = 0
    s = self.schedule[self.sched_item]
    #run the function stored in the schedule
    print(s[0])
    self.after(s[0], self.doanim_helper)

def doanim_helper(self):
    s = self.schedule[self.sched_item]
    # run the function stored in the schedule
    s[1]()
    self.sched_item += 1
    print(self.sched_item)
    if self.sched_item >= len(self.schedule):
        self.after(1000, self.quit)
    else:
        s = self.schedule[self.sched_item]
        self.after(s[0], self.doanim_helper)

图形函数的样本

def buttonpresswhatsapp(self, event):
    self.whatsapplabel.config(bg="red")
def buttonreleasewhatsapp(self, event):
    self.whatsapplabel.config(bg="white")

根据文档,当一个函数传递时,

在尝试呼叫之前对所有参数表达式进行评估

因此,在self.after(self.delay, self.genRandom(3))中,函数调用self.genRandom(3)立即评估,然后将其返回值传递给self.after。这就是为什么"一切都在一起俱乐部"而缺乏预期的延迟的原因。

而是要将可呼叫(例如函数对象(作为第二个参数传递:

self.after(self.delay, lambda: self.genRandom(3))
self.after(self.delay, lambda: self.createSchedule(3))
self.after(self.delay, self.doanim)

self.genRandom是一个函数。函数是一流的对象,可以将其作为参数传递给其他函数。在Python中,函数后的括号导致函数被调用。

相关内容

最新更新