# 错误写法: 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
更改了StringVar
named的内容text
并将其返回,但它没有被用作textvariable
新标签的。除了指定父窗口小部件之外,您应该只为构造函数使用关键字参数,否则参数的解释可能与您期望的不同。(坦率地说,我很惊讶你能以这种方式调用这个函数;我本以为在调用时会有 a TypeError
。)
无论如何,您需要做的就是——因为text
它也是全局的——直接.set
将其添加到新文本中。这将自动更新外观wordLabel
(模数通常刷新显示所需的任何 tkinter 内容)——这就是StringVar 容器类的要点(与仅使用普通字符串相反)。