在每次迭代时改变值 - python 3

时间:2017-09-14 14:22:36

标签: python-3.x variables tkinter pycharm

我正在使用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编程的一些非常基本的逻辑,如果这是一个微不足道的问题,那就很抱歉。我在写这里之前看了一下在线,我发现了一些方法,但每次我尝试实现它们时都会遇到同样的逻辑错误:如何从函数中定义一个变量?

2 个答案:

答案 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为我们提供随机坐标。