使用 tkinter OOP 安排事件顺序
Scheduling order of events with tkinter OOP
我在 python 3.6 中使用 tkinter 在 window 中间显示一个蓝色方块。每次单击时,蓝色方块应消失并在 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() 的调用方式
- 将 sleep 或 after 放在不同的地方
过去几个小时在网上搜索类似问题/解决方案并没有真正帮助。我想解决这个问题,同时了解我做错了什么。
事实证明,这个网页右侧的链接列表在发布问题后仅 3 分钟就为我提供了解决方案。
这是原帖Python Tkinter after event OOPS implementation
我在这里写下解决方案:
在使用 after 方法调用的函数中删除括号。所以这个 self.root.after(self.ITI,self.newtrial())
是 self.root.after(self.ITI,self.newtrial)
不幸的是,我仍然不明白这是如何解决问题的。
我在 python 3.6 中使用 tkinter 在 window 中间显示一个蓝色方块。每次单击时,蓝色方块应消失并在 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() 的调用方式
- 将 sleep 或 after 放在不同的地方
过去几个小时在网上搜索类似问题/解决方案并没有真正帮助。我想解决这个问题,同时了解我做错了什么。
事实证明,这个网页右侧的链接列表在发布问题后仅 3 分钟就为我提供了解决方案。
这是原帖Python Tkinter after event OOPS implementation
我在这里写下解决方案:
在使用 after 方法调用的函数中删除括号。所以这个 self.root.after(self.ITI,self.newtrial())
是 self.root.after(self.ITI,self.newtrial)
不幸的是,我仍然不明白这是如何解决问题的。