1

我不是程序员,只是一个业余爱好者,所以如果你能告诉我解决我的问题的“pythonic 方式” ,我会很高兴。

我想要的是:

我想用 tkinter 创建一个菜单,它有一个“新游戏”、一个“设置”和一个“退出”按钮,如果我点击“退出”按钮,我想要一个“你确定吗?” 弹出窗口有一个“是”和一个“否”按钮,如果我点击“否”按钮,我想销毁“你确定吗?” 弹出窗口。

发生了什么:

“新游戏”和“设置”按钮完全按照我想要的方式工作,但是当我点击“退出”按钮时,我得到“你确定吗?” 弹出窗口,我收到此错误:

名称“varAreYouSureToplevel”未定义

如果这不是正确的方法,请告诉我它通常是如何制作的。

我正在学习如何编写课程,当我尝试在课程中使用 Tkinter 时,这让我有点困惑。

如果您对此有解决方案(使用 Tkinter root 和 Toplevel)而无需编写课程,那么我会很高兴看到它!

我正在使用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()
4

2 回答 2

2

funcExit()你有例如Label(varAreYouSureToplevel)(和Buttonx2)。

varAreYouSureToplevel是 的一个属性self,但是您在没有 的情况下引用它self.,因此 Python 正在查看全局命名空间,并且您会看到正在观察的错误。

将这三个语句更改为例如

Label(self.varAreYouSureToplevelButton(self.varAreYouSureToplevel

你的代码工作得很好。

于 2015-11-10T11:18:57.483 回答
1

我建议使用消息框而不是创建另一个窗口。除非你想要的不仅仅是一个简单的是/否。

def funcExit(self):
    ans = messagebox.askokcancel('Are you sure?', 'Are you sure you want to exit?')
    if ans: os._exit(1)
于 2015-11-10T11:45:04.963 回答