1

「定義テスト」タイプのプログラムを作成しています(ユーザーが単語、品詞、およびすべての単語の同義語を入力すると、プログラムはその情報についてユーザーにクイズを出します)。最後のウィンドウ (クイズ ウィンドウ) には、次のようなウィンドウ レイアウトがあります。

1/25 What is the definition of _word_? # number out of total + prompt
Definition: _entry_ # entry fields for information
Part of Speech: _entry_
Next Help Quit # buttons; 'Next' checks the info and goes to the next word 
# 'Help' shows the info and goes to the next word
# 'Quit' force-quits the program
Tries Left: 5 # how many tries before the info is shown

私が抱えている問題は、「ヘルプ」ボタンにあります。通常、間違った情報を 5 回入力するだけで、「ヘルプ」ウィンドウが正常に作成されます。ただし、元の単語 (回答できなかった単語) は開いたままにします。この新しいウィンドウを閉じると、新しい単語が表示されますが、新しい単語 + 古い単語の 2 つのウィンドウが表示されます。また、「ヘルプ」ボタン自体でエラーが発生します。

>>> 

Traceback (most recent call last):
  File _filepath_, line 455, in <module>
    main()
  File _filepath_, line 68, in main
    test(screenDim, test_dict)
  File _filepath_, line 451, in test
    root.destroy()
  File "C:\Python2.7.3\lib\lib-tk\Tkinter.py", line 1728, in destroy
    self.tk.call('destroy', self._w)
TclError: can't invoke "destroy" command:  application has been destroyed

これが私のtest関数です(問題を見つけやすくするためにコードを少しトリミングしました):

def test(screenDim, test_dict):
    class TestWords:
        def __init__(self, master):
            w, h = screenDim[0], screenDim[1]
            rootW, rootH, xPos, yPos = int(float(w)/3), int(float(h)/4), w/2 - (w/6), h/2 - (h/8)
            self.frame = Frame(master)
            self.frameB = Frame(self.frame)
            self.frameE = Frame(self.frame)
            self.posE = Entry(self.frameE, width = 50, justify = CENTER)
            self.defE = Entry(self.frameE, width = 50, justify = CENTER)
            self.posE.grid(row = 1, column = 2, pady = 5)
            self.defE.grid(row = 2, column = 2, pady = 5)
            # there are a few other widgets/frames that don't pertain to this problem
            self.goButton = Button(self.frameB, text = 'Next', command = self.getInfo, width = 10)
            self.helpButton = Button(self.frameB, text = 'Help', command = self.getHelp, width = 10)
            self.quitButton = Button(self.frameB, text = 'Quit', command = self.quitBox, width = 10, fg = 'red')
            self.goButton.grid(row = 1, column = 1, padx = 10)
            self.helpButton.grid(row = 1, column = 2, padx = 10)
            self.quitButton.grid(row = 1, column = 3, padx = 10)
            master.geometry("%sx%s+%s+%s" % (rootW, rootH, xPos, yPos))
            self.frameE.grid(row = 3, pady = 5)
            self.frameB.grid(row = 4, padx = rootW/4 - 60, pady = 5)
            self.frame.grid()
        def quitBox(self):
            import sys
            sys.exit('Program Terminated.')
        def getHelp(self):
            triesLeft = 0
            self.frame.quit()
            root.destroy()
        def getInfo(self):
            info = (self.posE.get(), self.defE.get())
            self.frame.quit()
            return info
    class GetHelp:
        def __init__(self, master):
            w, h = screenDim[0], screenDim[1]
            rootW, rootH, xPos, yPos = int(float(w)/4), int(float(h)/4), w/2 - (w/8), h/2 - (h/8)
            self.frame = Frame(master)
            self.frameB = Frame(self.frame)
            self.goButton = Button(self.frameB, text = 'Next', command = self.frame.quit, width = 10)
            self.quitButton = Button(self.frameB, text = 'Quit', command = self.quitBox, fg = 'red', width = 10)
            self.goButton.grid(row = 1, column = 1, padx = 5)
            self.quitButton.grid(row = 1, column = 2, padx = 5)
            self.frameB.grid(row = 2, padx = rootW/4 - 20, pady = 5)
            master.geometry("%sx%s+%s+%s" % (rootW, rootH, xPos, yPos))
            self.frame.grid()
            # again, a few widgets were removed for brevity
        def quitBox(self):
            import sys
            sys.exit('Program Terminated.')
    n, words, reviewWords = len(test_dict.keys()), test_dict.keys(), []
    shuffle(words)
    for i in range(n):
        word, triesLeft = words[i], 4
        while triesLeft >= 0:
            root = Tk(className = ' Definition Tester')
            root.columnconfigure(0, weight=1)
            root.rowconfigure(0, weight=1)
            app = TestWords(root)
            root.mainloop()
            try:
                info = app.getInfo()
            except TclError:
                info = ('', '')
            if info[0] == test_dict[word][0] and info[1] in test_dict[word][1]:
                del words[i]
                root.destroy()
                break
            elif triesLeft == 0:
                reviewWords.append(word)
                root = Tk(className = ' Definition Tester')
                root.columnconfigure(0, weight=1)
                root.rowconfigure(0, weight=1)
                app = GetHelp(root)
                root.mainloop()
                break
            else:
                triesLeft -= 1
                root.destroy()

残り試行回数が 0 回になると、プログラムは自動的にヘルプ ウィンドウを表示します。したがって、「ヘルプ」ボタンはtriesLeft0 に設定されます。ただし、これではウィンドウが開かないようです。ありがとう!

4

2 に答える 2

2

ソリューションを再設計して、ルートウィンドウを1つだけ作成し、のインスタンスを1つだけ実行するようにする必要がありますmainloop。ルートウィンドウを何度も作成および破棄する代わりに、のインスタンスを作成および破棄しますToplevel。Tkinterは、複数のルートウィンドウを作成および破棄するようには設計されていません。

于 2013-02-23T16:46:44.550 に答える
0

tkinter 変数を変更して、関数内の現在のウィンドウを終了し、別のウィンドウを開く必要があります

def new_window():
    current_tkinter_variable.quit()
    new_variable=Tk()
    #carry on
于 2019-09-12T12:42:32.467 に答える