如何在破坏 Toplevel window 的同一个 class 中调用一个函数? (Python, Tkinter)
How to call a function inside the same class that destroys the Toplevel window? (Python, Tkinter)
我不是程序员,只是一个爱好者,所以如果你能告诉我"pythonic way"解决我的问题的方法我会很高兴 .
我想要的:
我想用 tkinter 创建一个菜单,它有一个 "New Game"、一个 "Settings" 和一个 "Exit" 按钮,如果我点击 "Exit" 按钮,我想要一个 "Are You Sure?" 弹出 window 有一个 "Yes" 和一个 "No" 按钮,如果我点击 "No" 按钮,我想销毁"Are You Sure?" 弹出窗口 window.
发生了什么:
"New Game" 和 "Settings" 按钮完全符合我的要求,
但是当我点击 "Exit" 按钮时,我得到 "Are You Sure?" 弹出窗口 window,我得到这个错误:
名称'varAreYouSureToplevel'未定义
如果这不是正确的方法,请告诉我它通常是如何制作的。
我正在学习如何写 classes,这让我有点困惑,
当我尝试在 class.
中使用 Tkinter 时
如果您对此有解决方案(使用 Tkinter root 和 Toplevel)
不写 classes,
那我会很高兴看到它!
我正在使用Python 3.4
感谢您的帮助!
这是我的代码:
from tkinter import *
import os
class classMainMenu(Frame):
def __init__(self, varRoot):
Frame.__init__(self, varRoot)
self.grid()
self.funcMainMenu()
def funcMainMenu(self):
self.varNewGameButton = Button(self, text="New Game", command=self.funcNewGame)
self.varNewGameButton.grid(row=0, column=0)
self.varSettingsButton = Button(self, text="Settings", command=self.funcSettingsMenu)
self.varSettingsButton.grid(row=1, column=0)
self.varExitButton = Button(self, text="Exit", command=self.funcExit)
self.varExitButton.grid(row=2, column=0)
def funcNewGame(self):
self.varNewGameButton.destroy()
self.varSettingsButton.destroy()
self.varExitButton.destroy()
print("New Game")
def funcSettingsMenu(self):
self.varNewGameButton.destroy()
self.varSettingsButton.destroy()
self.varExitButton.destroy()
print("Settings")
def funcExit(self):
self.varAreYouSureToplevel = Toplevel(self)
self.varAreYouSureToplevel.title("Are you sure?")
self.varAreYouSureTextLabel = Label(varAreYouSureToplevel, text="Are you sure you want to exit?") # HERE IT SAYS: NameError: name 'varAreYouSureToplevel' is not defined
self.varAreYouSureTextLabel.grid(row=3, column=0)
self.varAreYouSureYesButton = Button(varAreYouSureToplevel, text="Yes", command=self.funcExitToDesktop)
self.varAreYouSureYesButton.grid(row=4, column=0)
self.varAreYouSureNoButton = Button(varAreYouSureToplevel, text="No", command=self.funcDestroyToplevel)
self.varAreYouSureNoButton.grid(row=4, column=1)
def funcDestroyToplevel(self):
self.varAreYouSureToplevel.destroy
def funcExitToDesktop(self):
os._exit(1)
varRoot = Tk()
objectMainMenu = classMainMenu(varRoot)
objectMainMenu.mainloop()
在 funcExit()
你有例如Label(varAreYouSureToplevel)
(和 Button
x2)。
varAreYouSureToplevel
是 self
的一个属性,但您在没有 self.
的情况下引用它,因此 Python 正在查找全局命名空间,您得到您观察到的错误。
将这三个语句更改为例如
Label(self.varAreYouSureToplevel
和 Button(self.varAreYouSureToplevel
而且您的代码工作正常。
我建议使用消息框而不是创建另一个 window。除非你想要的不仅仅是一个简单的 Yes/No.
def funcExit(self):
ans = messagebox.askokcancel('Are you sure?', 'Are you sure you want to exit?')
if ans: os._exit(1)
我不是程序员,只是一个爱好者,所以如果你能告诉我"pythonic way"解决我的问题的方法我会很高兴 .
我想要的:
我想用 tkinter 创建一个菜单,它有一个 "New Game"、一个 "Settings" 和一个 "Exit" 按钮,如果我点击 "Exit" 按钮,我想要一个 "Are You Sure?" 弹出 window 有一个 "Yes" 和一个 "No" 按钮,如果我点击 "No" 按钮,我想销毁"Are You Sure?" 弹出窗口 window.
发生了什么:
"New Game" 和 "Settings" 按钮完全符合我的要求, 但是当我点击 "Exit" 按钮时,我得到 "Are You Sure?" 弹出窗口 window,我得到这个错误:
名称'varAreYouSureToplevel'未定义
如果这不是正确的方法,请告诉我它通常是如何制作的。
我正在学习如何写 classes,这让我有点困惑, 当我尝试在 class.
中使用 Tkinter 时如果您对此有解决方案(使用 Tkinter root 和 Toplevel) 不写 classes, 那我会很高兴看到它!
我正在使用Python 3.4
感谢您的帮助!
这是我的代码:
from tkinter import *
import os
class classMainMenu(Frame):
def __init__(self, varRoot):
Frame.__init__(self, varRoot)
self.grid()
self.funcMainMenu()
def funcMainMenu(self):
self.varNewGameButton = Button(self, text="New Game", command=self.funcNewGame)
self.varNewGameButton.grid(row=0, column=0)
self.varSettingsButton = Button(self, text="Settings", command=self.funcSettingsMenu)
self.varSettingsButton.grid(row=1, column=0)
self.varExitButton = Button(self, text="Exit", command=self.funcExit)
self.varExitButton.grid(row=2, column=0)
def funcNewGame(self):
self.varNewGameButton.destroy()
self.varSettingsButton.destroy()
self.varExitButton.destroy()
print("New Game")
def funcSettingsMenu(self):
self.varNewGameButton.destroy()
self.varSettingsButton.destroy()
self.varExitButton.destroy()
print("Settings")
def funcExit(self):
self.varAreYouSureToplevel = Toplevel(self)
self.varAreYouSureToplevel.title("Are you sure?")
self.varAreYouSureTextLabel = Label(varAreYouSureToplevel, text="Are you sure you want to exit?") # HERE IT SAYS: NameError: name 'varAreYouSureToplevel' is not defined
self.varAreYouSureTextLabel.grid(row=3, column=0)
self.varAreYouSureYesButton = Button(varAreYouSureToplevel, text="Yes", command=self.funcExitToDesktop)
self.varAreYouSureYesButton.grid(row=4, column=0)
self.varAreYouSureNoButton = Button(varAreYouSureToplevel, text="No", command=self.funcDestroyToplevel)
self.varAreYouSureNoButton.grid(row=4, column=1)
def funcDestroyToplevel(self):
self.varAreYouSureToplevel.destroy
def funcExitToDesktop(self):
os._exit(1)
varRoot = Tk()
objectMainMenu = classMainMenu(varRoot)
objectMainMenu.mainloop()
在 funcExit()
你有例如Label(varAreYouSureToplevel)
(和 Button
x2)。
varAreYouSureToplevel
是 self
的一个属性,但您在没有 self.
的情况下引用它,因此 Python 正在查找全局命名空间,您得到您观察到的错误。
将这三个语句更改为例如
Label(self.varAreYouSureToplevel
和 Button(self.varAreYouSureToplevel
而且您的代码工作正常。
我建议使用消息框而不是创建另一个 window。除非你想要的不仅仅是一个简单的 Yes/No.
def funcExit(self):
ans = messagebox.askokcancel('Are you sure?', 'Are you sure you want to exit?')
if ans: os._exit(1)