<p>该错误是由于<code>GameInfoLabel</code>是<code>GameInfo()</code>内的局部变量,在<code>QuitGameInfo()</code>内无法访问该变量</p>
<p>您可以通过将<code>GameInfoLabel</code>声明为全局或通过参数将其传递给<code>QuitGameInfo()</code>来修复此错误。这同样适用于<code>BackInfoButton</code></p>
<p>但是,您需要解决另一个问题:<code>GameInfoLabel</code>和<code>BackInfoButton</code>都是<code>None</code>,因为它们是<code>pack()</code>的结果</p>
<p>下面是使用全局解决方案修改的代码:</p>
<pre><code>from tkinter import *
root = Tk()
root.title("Game Menu")
root.geometry("1920x1080")
root.resizable(True, True)
def QuitGameInfo():
GameInfoLabel.destroy()
#BackInfoButton['state'] = NORMAL # why ??? Should it be destroyed as well?
BackInfoButton.destroy()
def GameInfo():
global GameInfoLabel, BackInfoButton
with open("GameInfo.txt",'r') as RulesNotepad:
Rules = RulesNotepad.read()
GameInfoLabel = Label(root, text = Rules, fg = "blue", bg = "red", height = "14", width = "140")
GameInfoLabel.pack()
BackInfoButton = Button(root, text = "Back", command = QuitGameInfo)
BackInfoButton.pack()
Button(root, text = "Info", command = GameInfo, width = "20", height = "3").pack()
root.mainloop()
</code></pre>
<hr/>
<p>但是,我建议使用一个框架来保存<code>GameInfoLabel</code>和<code>BackInfoButton</code>,框架最初是隐藏的。单击<kbd>Info</kbd>按钮时,显示帧。单击“后退”按钮时,隐藏帧</p>
<pre><code>from tkinter import *
root = Tk()
root.title("Game Menu")
root.geometry("1920x1080")
root.resizable(True, True)
def GameInfo():
with open("GameInfo.txt",'r') as RulesNotepad:
Rules = RulesNotepad.read()
GameInfoLabel.config(text=Rules)
info_frame.pack() # show the game info frame
Button(root, text="Info", command=GameInfo, width="20", height="3").pack()
# create the game info frame but don't show it initially
info_frame = Frame(root)
GameInfoLabel = Label(info_frame, fg="blue", bg="red", height="14", width="140")
GameInfoLabel.pack()
Button(info_frame, text="Back", command=info_frame.pack_forget).pack()
root.mainloop()
</code></pre>