1

私はプログラマーではなく、ただの趣味なので、私の問題に対する「pythonic な方法」の解決策を教えていただければ幸いです。

私が欲しいもの:

「New Game」、「Settings」、「Exit」ボタンのあるメニューをtkinterで作成したいのですが、「Exit」ボタンをクリックすると、「よろしいですか?」「はい」と「いいえ」ボタンがあるポップアップウィンドウで、「いいえ」ボタンをクリックすると、「よろしいですか?」を破棄したい ポップアップウィンドウ。

何が起こっていますか:

「新しいゲーム」ボタンと「設定」ボタンは思い通りに機能しますが、「終了」ボタンをクリックすると「よろしいですか?」というメッセージが表示されます。ポップアップ ウィンドウで、次のエラーが表示されます。

名前「varAreYouSureToplevel」は定義されていません

これが正しい方法でない場合は、通常の方法を教えてください。

クラスの書き方を学んでいますが、クラス内で Tkinter を使用しようとすると、少し混乱します。

クラスを作成せずに (Tkinter root と Toplevel を使用して) これに対する解決策がある場合は、それを見てとてもうれしいです!

私はPython 3.4を使用しています

ご協力ありがとうございました!

NameError - 画像

これが私のコードです:

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()はeg Label(varAreYouSureToplevel)(およびButtonx2)があります。

varAreYouSureToplevelは の属性ですがself、 なしで参照しているself.ため、Python はグローバル名前空間を検索しており、観察しているエラーが発生します。

これらの 3 つのステートメントを次のように変更します。

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 に答える