You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

二、代码其他问题修复

除了导入错误,你的代码还有多处逻辑和语法问题,以下是逐一修复:

  1. 目标单词未定义为字符串:ans = robot会被识别为变量,需改为字符串:
ans = "robot"
  1. 错误获取用户输入: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
  1. 重复初始化匹配列表导致逻辑错误:第一个循环中每次重新创建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"
  1. 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)
  1. 未维护猜测次数与游戏结束逻辑:添加猜测次数统计,并处理胜利/失败的结束逻辑:
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
  1. 按钮缺失文本: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:01:05