0

現在、パリンドローム検出器の GUI をコーディングしていますが、いくつかの問題に遭遇しました。プログラムを起動でき、GUI は問題ないようです。すべてのボタンは、重要なボタンである Testa Palindrom (Testa Palindrome に変換されます) を除いて機能します。

そのボタンをクリックするたびに、NameError: global name 'palindromentry' is not defined が発生します。

以下にコード全体を示しますが、最初にその機能を簡単に説明します。

def ordnaText は、テキストを下げてチェック用に修正します。def testap は for ループを使用して回文であるかどうかをテストします。def visaResultat は結果を示します (これは label1.config で確認できます)。

私の質問は: なぜこのエラーが発生するのですか? 私は私の人生のためにそれを理解することはできません。

import tkinter
import tkinter.messagebox
def main():

    gui()
    tkinter.mainloop()

def gui():
    main_window = tkinter.Tk()
    top_frame = tkinter.Frame()
    mid_frame = tkinter.Frame()
    bottom_frame = tkinter.Frame()


    main_window.title("Palindromdetektor")
    main_window.geometry("400x400")



    label1 = tkinter.Label(top_frame, text = "Skriv in ett palindrom nedan för att testa det!",
                                bg = "green", width = 60, height = 6)
    button1 = tkinter.Button(mid_frame, text = "Testa palindrom", height = 3, width = 22,
                                bg = "Purple", command = mainaction) 

    button2 = tkinter.Button(bottom_frame, text= "Instruktioner", height = 3, width = 22,
                                bg = "Purple", command = messagebox) 

    button3 = tkinter.Button(bottom_frame, text ="Spara palindrom", height = 3, width = 22,
                                bg = "Purple") #command = sparapalindrom) 

    button4 = tkinter.Button(bottom_frame, text ="Avsluta programmet", height = 3, width = 22,
                                bg = "Purple", command=main_window.destroy)



    palindromentry = tkinter.Entry(mid_frame, width = 67)
    palindromentry.pack()

    top_frame.pack()
    mid_frame.pack()
    bottom_frame.pack()

    label1.pack()
    button1.pack()
    button2.pack()
    button3.pack()
    button4.pack()



def ordnaText(text):
        nytext = ("") 
        fixadText = text.lower() 
        for i in fixadText: 
            if i.isalnum(): 
                nytext = (nytext + i) 
        return nytext 



def testap(nytext):
        palindrom  = True 
        for i in range (0, len(nytext)):
            if (nytext[i]) != (nytext[len(nytext)-i-1]): 
                palindrom = False 
        return palindrom

def visaResultat(palindrom):
    if palindrom:
            label1.config(text="Ja, detta är ett palindrom!", bg="green")
    else:
            label1.config(text="Nej, detta är inte ett palindrom!", bg="red")

def messagebox():
        tkinter.messagebox.showinfo("Hjälp", "Detta är ett program som testar vare sig en text är ett palindrom eller inte.\n \
Skriv in din text i rutan och tryck på Testa Palindrom-knappen så får du se ditt resultat högst upp.\n \
Om du vill avsluta programmet klickar du på knappen som heter Avsluta programmet.\n \
Detta program är kodat av Olof Unge som nås via mail: olofunge@hotmail.com.\n \
Tack för att du använder detta program!")

#def sparapalindrom():
 #   try:
  #      if palindrom:
   #         myfile = open("palindrom.txt", "a")
    #        myfile.write(text\n)
     #       myfile.close()
      #  else:
       #     label1.config(text="Du kan bara spara godkända palindrom.")
    # except IOError:
     #   label1.config(text="Kunde inte hitta / skapa filen.")



def mainaction():
    global text
    text = palindromentry.get()
    ordnaText(text)
    testap(ordnaText(text))
    visaResultat(testap(ordnaText(text)))

main()

トピックに固執し、それ以外はコメントしないでいただければ幸いです。他のすべては正常に機能するためです。どうもありがとうございました!

よろしくお願いします。

これは PYTHON 3.0 でコーディングされています

4

1 に答える 1

1

palindromentry関数で定義されていguiます。そのため、スコープはその単一の機能に限定されます。ボタンをクリックすると、関数が呼び出されますが、関数のスコープmainactionはわかりません。gui

ここにいくつかのオプションがあります(私の好みの順序で):

  1. 関数呼び出し間で状態を共有できるように、これらすべてをクラスにします
  2. の定義を関数に移動しmainactionますgui(アクションを実行するボタンの前に定義する必要があります...)。
  3. 回文を次のように宣言しますglobalgui
于 2013-01-07T16:17:58.533 に答える