【问题标题】:Scheduling order of events with tkinter OOP使用 tkinter OOP 安排事件的顺序
【发布时间】:2018-09-05 19:01:43
【问题描述】:

我在 python 3.6 中使用 tkinter 在窗口中间显示一个蓝色方块。每次单击时,蓝色方块应消失并在 2 秒后重新出现在不同的随机位置。运行以下代码时,蓝色方块(称为刺激)不会消失。其他一切似乎都正常工作。

这是代码:

import tkinter as TK
import random as RAN

class THR:
    def __init__(self, root):
        self.root = root
        self.root.config(background='black')

        self.screenYpixels = 600
        self.screenXpixels = 1024
        self.ITI = 2000

        self.background = TK.Canvas(root, width=1024, height=600, bg='black',
                                    bd=0, highlightthickness=0, relief='ridge')

        self.background.pack()
        self.newtrial()

    def newtrial(self):
        self.xpos = RAN.randrange(200, 1000)
        self.ypos = RAN.randrange(100, 500)

        self.stimulus = TK.Canvas(root,width=100,height=100,bg='blue', bd=0, 
                                  highlightthickness=0, relief='ridge')
        self.stimulus.place(x=self.xpos, y=self.ypos, anchor="c")
        self.stimulus.bind("<Button-1>", self.response)

        self.exitbutton()

    def response(self, event):
        self.stimulus.place_forget()
        self.intertrialinterval()

    def intertrialinterval(self, *args):
        self.root.after(self.ITI,self.newtrial())

    def exitbutton(self):
        self.exitButton = TK.Button(self.root, bg="green")
        self.exitButton.place(relx=0.99, rely=0.01, anchor="c")
        self.exitButton.bind("<Button-1>", self.exitprogram)

    def exitprogram(self, root):
        self.root.quit()


root = TK.Tk()
THR(root)
root.mainloop()

这里列出了我尝试过但没有用的东西

  • 使用 time.sleep 代替 root.after
  • 更改 newtrial() 的调用方式
  • sleepafter放在不同的地方

过去几个小时在网上搜索类似问题/解决方案并没有真正帮助。我想解决这个问题,同时了解我做错了什么。

【问题讨论】:

  • after 需要一个函数的reference。您立即调用该函数。
  • 我明白了。我想我需要更好地理解引用和调用函数之间的区别。

标签: python-3.x oop tkinter root


【解决方案1】:

事实证明,该网页右侧的链接列表在发布问题后仅 3 分钟就为我提供了解决方案。

这是原帖Python Tkinter after event OOPS implementation

我在这里写下解决方案: 在使用 after 方法调用的函数中删除括号。所以这个self.root.after(self.ITI,self.newtrial())self.root.after(self.ITI,self.newtrial)

不幸的是,我仍然不明白这是如何解决问题的..

【讨论】:

  • after(x, foo())result=foo(); after(x, result) 相同。 after(x,foo) 表示“在 x 毫秒后,运行函数 foo
  • 我现在更好地理解了问题所在。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2021-11-23
  • 2018-05-31
  • 2019-03-31
  • 2020-05-10
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多