我正在使用Tkinter在树莓派上构建一个非常简单的基于trouchscreen的实验。我想不断地在屏幕上显示一个刺激(所以我的代码的列表行是 win.mainloop()。每次点击/触摸刺激时,刺激应该改变位置。我生成做基本三角函数的刺激位置:
distance = 0.2
angle_range = list(range(0, 360, 45))
xc = (math.sin(angle_range[0] * 0.0174) * distance) + 0.5
yc = (math.cos(angle_range[0] * 0.0174) * distance) + 0.5
然后我使用 xc 和 yc 将刺激定位在屏幕上(在这种情况下,它将被tkinter视为按钮):
photo = PhotoImage(file="FaceStimulus.png")
Stimulus = Button(win, command=changePosition)
Stimulus.config(image=photo)
Stimulus.place(relx=xc, rely=yc)
最后是与按钮相关的功能
def changePosition():
print("Stimulus pressed")
angle_range = random.shuffle(angle_range)
在函数changePosition中,我要求对位置列表进行随机播放,这实际上并没有发生。刺激始终保持其初始位置。
我可能错过了python编程的一些非常基本的逻辑,如果这是一个微不足道的问题,那就很抱歉。我在写这里之前看了一下在线,我发现了一些方法,但每次我尝试实现它们时都会遇到同样的逻辑错误:如何从函数中定义一个变量?
答案 0 :(得分:0)
声明xc = something
后,xc会被锁定并且不会更改,除非您进入并更改它。改变它所基于的列表什么都不做。尝试更新函数中的变量,而不仅仅是列表。
此代码可能不起作用,但希望能帮助您弄清楚该怎么做。
def changePosition():
print("Stimulus pressed")
random.shuffle(angle_range)
xc = (math.sin(angle_range[0] * 0.0174) * distance) + 0.5
yc = (math.cos(angle_range[0] * 0.0174) * distance) + 0.5
Stimulus.place(relx=xc, rely=yc)
答案 1 :(得分:0)
请参阅下面我解释的代码段:
from tkinter import *
import math
import random
class App:
def __init__(self, root):
self.root = root
self.distance = 0.2
self.angle_range = list(range(0, 360, 45))
#this is a placeholder for your stimulus
self.label = Label(self.root, text="Image Placeholder")
self.command() #calls the command to generate the first position
self.label.bind("<Button-1>", self.command) #creates a callback whenever the label is clicked with mousebutton 1
def command(self, *args):
#i'll explain this below the snippet
var = random.choice(self.angle_range)
self.xc = (math.sin(var * 0.0174) * self.distance) + 0.5
self.yc = (math.cos(var * 0.0174) * self.distance) + 0.5
self.label.place(relx=self.xc, rely=self.yc)
root = Tk()
App(root)
root.mainloop()
所以看起来你之前遇到的问题是你只是在调用0th
中的list
元素。为了解决这个问题,我添加了self.angle_range[random.randrange(len(self.angle_range))]
。
让我们打破这一点。
self.angle_range[n]
是您的列表,包含我们之前传播的所有元素。所以我们想要这个列表中的随机元素?细
所以我们使用random.choice(self.angle_range)
来获取一个随机元素。
这将返回list
self.angle_range
中的随机元素,根据我们提供的list
为我们提供随机坐标。