Python Tkinter - 循环前运行窗口

时间:2016-09-22 19:51:33

标签: python tkinter

背景资料

以下是我目前正致力于创建一个基本上打印单词的程序的代码,并要求您正确拼写单词。一个单词只能打印一次,因为一旦使用它就被放入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")

1 个答案:

答案 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类的类中。在我看来,一旦你的程序变得更复杂,它会使事情变得更容易。