背景资料
以下是我目前正致力于创建一个基本上打印单词的程序的代码,并要求您正确拼写单词。一个单词只能打印一次,因为一旦使用它就被放入usedWords字典中,以便不被重用。当所有单词都用完后,while循环结束。这一切都很完美,但是现在我试图将它与GUI集成。
我的问题具体是什么
问题是我希望Tkinter窗口有一个标签,并且每次打印出一个新单词时都会更新标签。但是,我目前收到错误 AttributeError:' NoneType'对象没有属性' _root' 我相信这种情况正在发生,因为我已经尝试在定义主窗口之前添加一个Label,但我无法以任何其他方式执行此操作,如果在循环之前定义窗口,则在循环结束之前窗口未打开,这显然违背了我想要实际做的事情。
所有这些 - 我的问题
这很简单 - 我该怎么做这个问题?我想在循环之前创建窗口,并且每次从列表中选择一个新单词时都在窗口中更新标签
import random
import time
from tkinter import *
from tkinter.messagebox import *
words = ['reflection', 'attitude', 'replicate', 'accomodate', 'terrain',
'arguemental', 'stipulate', 'stimulation', 'latitude', 'marginal',
'thedubester', 'security', 'documentation', 'ukulele',
'terminal', 'exaggeration', 'declaration', 'apptitude', 'absence',
'aggressive', 'acceptable', ' allegiance', 'embarass', 'hierarchy',
'humorous', 'existence']
usedWords = []
while len(usedWords) < len(words):
chooseWord = words[random.randrange(len(words))]
var = StringVar()
display = Label(textvariable = var)
display.place(x=1,y=1)
if chooseWord not in usedWords:
var.set(chooseWord)
userSpelt = input("Spelling: ")
usedWords.append(chooseWord)
if userSpelt in words:
print("Correctly spelt!")
else:
print("Incorrectly spelt!")
master = Tk()
master.geometry("500x600")
master.title("Minesweeper V 1.0")
master.configure(background="#2c3e50")
答案 0 :(得分:2)
我认为您遇到的一个问题是尝试从控制台输入创建一个对话框。我确定有办法做到这一点,但目前我无法想到一个好办法。
另一个问题是,在您完成单词列表中的单词数量之前,您实际上并未创建窗口(主程序,在您的脚本中)。
Tkinter与控制台脚本有点不同。它是基于事件的,所以如果你在应用程序中编写一个while循环,tkinter将&#34;暂停&#34;直到循环完成。
相反,您可能希望让循环由tkinter和代码完成。这是我提出的一个简单的实现。它仍然需要工作,但它完成了工作(我假设您正在使用python 3,因为您正在使用&#34; tkinter&#34;全部小写):
import random
from tkinter import *
from tkinter.messagebox import *
words = ['reflection', 'attitude', 'replicate', 'accomodate', 'terrain',
'arguemental', 'stipulate', 'stimulation', 'latitude', 'marginal',
'thedubester', 'security', 'documentation', 'ukulele',
'terminal', 'exaggeration', 'declaration', 'apptitude', 'absence',
'aggressive', 'acceptable', ' allegiance', 'embarass', 'hierarchy',
'humorous', 'existence']
usedWords = []
class App(Tk):
def __init__(self):
super().__init__()
self._frame = Frame(self)
self._frame.pack()
self._label = Label(self, text="")
self._label.pack()
self._entry_var = StringVar()
self._entry = Entry(self, textvariable=self._entry_var)
self._entry.pack()
self._button = Button(
self,
text="Check",
command=self.check_callback
)
self._button.pack()
self.get_new_word()
def check_callback(self):
if self._current_word == self._entry.get():
showinfo("Correct", "Correctly spelled.")
usedWords.append(self._current_word)
else:
showwarning("Incorrect", "Incorrectly spelled.")
words.append(self._current_word)
self.get_new_word()
def get_new_word(self):
self._current_word = words.pop(random.randrange(len(words)))
self._label.configure(text=self._current_word)
self._entry_var.set("")
self.title(self._current_word)
app = App()
app.mainloop()
这会将tkinter部分移动到继承自Tk类的类中。在我看来,一旦你的程序变得更复杂,它会使事情变得更容易。