结合心理实验和实时网络:用PsychoPy和Tornado打造互动实验体验

静静爱编程 2025-02-27 12:57:43

在这篇文章里,我们将一起探索两个强大的 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,能够创造出更为丰富和互动的心理实验体验。随着你对这两个库理解的加深,可以设计出更加复杂和富有创意的项目。如果你在学习过程中有任何疑问,随时可以留言联系我,我会很乐意帮助你。愿你的编程之旅充满乐趣与发现!

0 阅读:0
静静爱编程

静静爱编程

快来学习吧!