在这篇文章里,我们将一起探索两个强大的 Python 库:PsychoPy 和 Tornado。PsychoPy 是一个用于心理学实验设计和刺激呈现的工具,能帮助研究人员轻松制作实验。而 Tornado 则是一款高性能的异步网络框架,能够支持实时 web 应用程序。将这两个库结合起来,可以让你的心理实验不仅脱离传统的桌面环境,还能实现与参与者的在线互动。这种组合能显著提升用户体验,让实验更具互动性。接下来,我们来具体看看如何使用这两个库。
运用 PsychoPy 和 Tornado 的组合,我们可以实现多种有趣的功能。首先,我们可以构建一款实时反应时间实验,参与者可以通过网页参与实验并提交他们的反应时间。代码示例中,我们将通过 Tornado 创建一个网页,展示刺激并接收参与者的输入。
# Import necessary librariesfrom psycho import visual, core, eventimport tornado.ioloopimport tornado.webimport json# Set up PsychoPy for visual stimuliwin = visual.Window([800, 600])# Simple function to show stimulusdef show_stimulus(text): stimulus = visual.TextStim(win, text=text) stimulus.draw() win.flip() core.wait(1) # Display for 1 second# Prepare the Tornado RequestHandlerclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("<h1>反应时间实验</h1>") self.write("<button id='start'>开始</button>") self.write(""" <script> document.getElementById('start').onclick = function() { fetch('/stimulus').then(response => response.json()).then(data => { alert('刺激是:' + data.stimulus); }); } </script> """) def post(self): # Capture participant response here response = self.get_body_argument("response") print("参与者反应:", response)app = tornado.web.Application([ (r"/", MainHandler), (r"/stimulus", MainHandler)])if __name__ == "__main__": app.listen(8888) tornado.ioloop.IOLoop.current().start()
这里,用户在浏览器中点击“开始”按钮时会请求一个刺激并显示在弹窗中。这个简单的实验可以被扩展,添加更多复杂的元素,比如不同的刺激类型。
第二个结合功能是创建在线调查反馈系统。我们可以使用 PsychoPy 来显示调查问题,通过 Tornado 来收集答案并将其存储。
class SurveyHandler(tornado.web.RequestHandler): def get(self): self.write("<h1>在线调查</h1>") self.write("<form method='POST' action='/submit'>") self.write("<p>你最喜欢的颜色是?</p>") self.write("<input type='text' name='color'>") self.write("<input type='submit' value='提交'>") self.write("</form>") def post(self): favorite_color = self.get_body_argument("color") print("参与者最喜欢的颜色:", favorite_color)app = tornado.web.Application([ (r"/survey", SurveyHandler),])
这个程序允许用户填写他们最喜欢的颜色并接收输入。你可以根据实际需要扩展调查的问题和存储数据。
最后,我们来看看第三个结合功能,让参与者实时看到实验结果。利用 Tornado 的 WebSocket 功能,实时更新参与者的反馈或结果图表就变得简单了。
import tornado.websocketclass ResultHandler(tornado.websocket.WebSocketHandler): clients = set() def open(self): self.clients.add(self) def on_close(self): self.clients.remove(self) @classmethod def broadcast(cls, message): for client in cls.clients: client.write_message(message)app = tornado.web.Application([ (r"/results", ResultHandler),])# 启动 WebSocket 服务并处理反馈
在这个例子中,我们能实现多人参与的实验,每个人的反馈和结果都会实时更新到每个参与者的页面上。你会发现,通过这种方式,实验的互动性大大增强。
使用这两个库结合开发也不是没有挑战。你可能会遇到代码同步和数据一致性的问题。例如,当多名参与者同时提交数据时,可能会导致数据覆盖或丢失。为了解决这个问题,采用数据库(比如 SQLite 或 PostgreSQL)持久化存储数据是个聪明的做法。另一方面,适当使用异步方法将有助于提高应用的性能和响应速度。在 Tornado 中使用 async 和 await 关键字,可避免数据竞争问题。
总之,结合 PsychoPy 和 Tornado,能够创造出更为丰富和互动的心理实验体验。随着你对这两个库理解的加深,可以设计出更加复杂和富有创意的项目。如果你在学习过程中有任何疑问,随时可以留言联系我,我会很乐意帮助你。愿你的编程之旅充满乐趣与发现!