python运行报错:TypeError: argument of type ‘StringVar’ is not iterable

# 错误写法:
txt_db = Entry(root,str_db)

# 正解写法:
txt_db = Entry(root,textvariable=str_db)

参考:
https://stackoverflow.com/questions/64271736/tkinter-typeerror-argument-of-type-stringvar-is-not-iterable

Tkinter TypeError:“StringVar”类型的参数不可迭代

提问:

我正在尝试编写一个使用 Tkinter 模拟 Hangman 游戏的 GUI。到目前为止,我已经让 GUI 创建一个标签,该标签根据用户猜对的字母进行更新,但终端仍然给出错误:“TypeError:’StringVar’ 类型的参数不可迭代”。我已经查看了此错误的其他解决方案,但一直无法弄清楚如何解决该问题。

它还没有完成 – 但这是到目前为止的代码:

import randomword
# from PyDictionary import PyDictionary
from tkinter import *

root = Tk()

playerWord: str = randomword.get_random_word()
word_guess: str = ''
guesses = ''


def returnEntry(arg=None):
    global word_guess
    global guesses
    global wordLabel
    word_guess = ''
    # dictionary = PyDictionary()

    failed = 0
    incorrect = 10
    result = myEntry.get()

    while incorrect > 0:
        if not result.isalpha():
            resultLabel.config(text="that's not a letter")

        elif len(result) != 1:
            resultLabel.config(text="that's not a letter")

        else:
            resultLabel.config(text=result)
            assert isinstance(END, object)
            myEntry.delete(0, END)

        guesses += result

        for char in playerWord:
            if char in guesses:
                # Print the letter they guessed
                word_guess += char

            elif char not in guesses:
                # Print "_" for every letter they haven't guessed
                word_guess += "_ "
                failed += 1

        if guesses[len(guesses) - 1] not in playerWord:
            resultLabel.config(text="wrong")
            incorrect -= 1

        wordLabel = Label(root, updateLabel(word_guess))
        myEntry.delete(0, END)


resultLabel = Label(root, text="")
resultLabel.pack(fill=X)


myEntry = Entry(root, width=20)
myEntry.focus()
myEntry.bind("<Return>", returnEntry)
myEntry.pack()


text = StringVar()
text.set("your word is: " + ("_ " * len(playerWord)))
wordLabel = Label(root, textvariable=text)
wordLabel.pack()


def updateLabel(word):
    text.set("your word is: " + word)
    return text


mainloop()

当我在 wordLabel 上运行函数时出现问题:“wordLabel = Label(root, updateLabel(word_guess))”以重置标签。关于在 while 循环迭代后如何让标签更新为 word_guess 的任何建议?

回复:

此行导致错误:

wordLabel = Label(root, updateLabel(word_guess))

你想多了。它应该是这样的:

updateLabel(word_guess)

您还有另一个重大错误。这一行:

while incorrect > 0:

将导致您的程序锁定。您需要将其更改为:

if incorrect > 0:

wordLabel = Label(root, updateLabel(word_guess))

您尝试创建一个新标签Label并使全局wordLabel引用新标签而不是旧标签。即使它工作正常,这也不会更新您的 GUI,因为新标签没有打包。

它中断的原因是,虽然updateLabel更改了StringVarnamed的内容text并将其返回,但它没有被用作textvariable新标签的。除了指定父窗口小部件之外,您应该只为构造函数使用关键字参数,否则参数的解释可能与您期望的不同。(坦率地说,我很惊讶你能以这种方式调用这个函数;我本以为在调用时会有 a TypeError。)

无论如何,您需要做的就是——因为text它也是全局的——直接.set将其添加到新文本中。这将自动更新外观wordLabel(模数通常刷新显示所需的任何 tkinter 内容)——这就是StringVar 容器类的要点(与仅使用普通字符串相反)。