使用PyScript开发Wordle游戏时遇ImportError:无法从pyodide导入create_proxy
解决PyScript中
ImportError: cannot import name 'create_proxy' from 'pyodide'问题并修复Wordle游戏代码 一、核心错误修复
你遇到的导入错误是因为Pyodide版本更新后,create_proxy函数从pyodide包根目录迁移到了pyodide.ffi模块下。只需要修改导入语句:
# 原错误导入 # from pyodide import create_proxy # 修正后的导入 from pyodide.ffi import create_proxy
二、代码其他问题修复
除了导入错误,你的代码还有多处逻辑和语法问题,以下是逐一修复:
- 目标单词未定义为字符串:
ans = robot会被识别为变量,需改为字符串:
ans = "robot"
- 错误获取用户输入:
guess函数的参数是点击事件对象,不是输入框内容,需要主动从输入框取值:
def guess(event): # 获取输入框内容并统一转为大写 current = document.getElementById("guess").value.strip().upper() # 验证输入为5个字母 if len(current) !=5 or not current.isalpha(): pyscript.write("colors", "请输入5个字母的有效单词!") return
- 重复初始化匹配列表导致逻辑错误:第一个循环中每次重新创建
listAns会破坏匹配逻辑,需将初始化移到循环外:
# 先标记位置正确的字母(绿色) listAns = list(ans.upper()) List_Of_Ans = [0]*5 for s in range(5): Tletter = currentL[s] if Tletter == listAns[s]: List_Of_Ans[s] = "GREEN" listAns[s] = None # 标记已匹配,避免重复检测 # 再标记存在但位置错误的字母(黄色) for s in range(5): if List_Of_Ans[s] == "GREEN": continue Tletter = currentL[s] if Tletter in listAns: List_Of_Ans[s] = "YELLOW" listAns[listAns.index(Tletter)] = None else: List_Of_Ans[s] = "GRAY"
pyscript.write用法错误:该函数第一个参数必须是元素ID,后续为输出内容,需修正为:
# 生成带颜色的结果文本 result_text = " | ".join([f"<span style='color:{color.lower()};font-weight:bold'>{currentL[i]}</span>" for i, color in enumerate(List_Of_Ans)]) pyscript.write("colors", result_text, append=False)
- 未维护猜测次数与游戏结束逻辑:添加猜测次数统计,并处理胜利/失败的结束逻辑:
guess_count = 0 tries = 6 def guess(event): nonlocal guess_count guess_count +=1 document.getElementById("guesses").innerText = f"Number of guesses: {guess_count}" # ...中间逻辑省略... # 判断胜利 if all(color == "GREEN" for color in List_Of_Ans): pyscript.write("colors", f"<p>YAY you got it in {guess_count} tries !!!</p>", append=True) document.getElementById("guessBTN").disabled = True # 判断失败 elif guess_count >= tries: pyscript.write("colors", f"<p>Game Over! The correct word was <b>{ans.upper()}</b></p>", append=True) document.getElementById("guessBTN").disabled = True
- 按钮缺失文本:HTML按钮需添加显示文本:
<input type="button" id="guessBTN" name="guess" value="Submit Guess" style="width: 750px; height: 70px; background-color: #0091ff;color: white;"/>
三、完整修复后的代码
<html> <head> <style> body{ margin: 0px; padding: 0px; background-color: #011627; color: #fdfffc; text-align: center; background-image: url(https://cdn.pixabay.com/photo/2015/07/02/10/13/sky-828648_960_720.jpg); background-position: center; background-repeat: no-repeat; background-size: cover; height: 100vh; } h1{ font-size: 65px; font-family: 'Comfortaa'; } input{ width: 75px; height: 55px; border-radius: 10px; font-size: 44px; margin: 10px; } .btn:hover{ background-color:green; cursor: pointer; } </style> <link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" /> <script defer src="https://pyscript.net/latest/pyscript.js"></script> </head> <body> <h1>Wordle Clone</h1> <p>Guess a word (5 letters)</p> <p id="guesses">Number of guesses: 0</p> <input type="text" id="guess" name="guess" placeholder="Enter 5 letters" style="width: 370px; height: 70px; background-color: #4c555c;color: white;"/> <br /><br /> <input type="button" id="guessBTN" name="guess" value="Submit Guess" style="width: 750px; height: 70px; background-color: #0091ff;color: white;"/> <p id="colors"></p> <py-script> from js import document from pyodide.ffi import create_proxy import pyscript ans = "robot" tries = 6 guess_count = 0 def guess(event): nonlocal guess_count # 获取并处理用户输入 current = document.getElementById("guess").value.strip().upper() ans_upper = ans.upper() # 输入验证 if len(current) != 5 or not current.isalpha(): pyscript.write("colors", "请输入5个字母的有效单词!") return guess_count += 1 document.getElementById("guesses").innerText = f"Number of guesses: {guess_count}" currentL = list(current) listAns = list(ans_upper) List_Of_Ans = [0]*5 # 第一步:标记位置正确的字母(绿色) for s in range(5): Tletter = currentL[s] if Tletter == listAns[s]: List_Of_Ans[s] = "GREEN" listAns[s] = None # 标记已匹配,避免重复 # 第二步:标记存在但位置错误的字母(黄色) for s in range(5): if List_Of_Ans[s] == "GREEN": continue Tletter = currentL[s] if Tletter in listAns: List_Of_Ans[s] = "YELLOW" listAns[listAns.index(Tletter)] = None else: List_Of_Ans[s] = "GRAY" # 输出带颜色的结果 result_text = " | ".join([f"<span style='color:{color.lower()};font-weight:bold'>{currentL[i]}</span>" for i, color in enumerate(List_Of_Ans)]) pyscript.write("colors", result_text, append=False) # 判断游戏结束条件 if all(color == "GREEN" for color in List_Of_Ans): pyscript.write("colors", f"<p>YAY you got it in {guess_count} tries !!!</p>", append=True) document.getElementById("guessBTN").disabled = True elif guess_count >= tries: pyscript.write("colors", f"<p>Game Over! The correct word was <b>{ans.upper()}</b></p>", append=True) document.getElementById("guessBTN").disabled = True # 绑定按钮点击事件 guess_proxy = create_proxy(guess) guess_button = document.getElementById("guessBTN") guess_button.addEventListener("click", guess_proxy) </py-script> </body> </html>
四、后续功能建议
- 添加键盘回车提交支持,提升操作流畅度
- 优化UI为方块式输入框,还原原版Wordle视觉风格
- 接入单词库,随机生成目标单词
- 添加屏幕虚拟键盘,支持点击输入
- 记录用户游戏历史与统计数据
内容的提问来源于stack exchange,提问作者Erez Ben-Zvi
相关产品推荐
相关产品推荐

