当我 运行 我的 GUI 代码在 Python 时发生属性错误。 Python 没有提供有关错误是什么或导致错误的信息

Attribute error occurs when I run my GUI code in Python. Python gives me no information as to what the error is or what is causing it

这是我的代码,当我尝试 运行 它并通过在输入字段中输入数字来使用它时,当我尝试调用输入变量时发生属性错误。这是出现的消息:

Tkinter 回调异常 追溯(最近一次通话): 文件 "C:\Python27\lib\lib-tk\Tkinter.py",第 1486 行,在 call 中 return self.func(*参数) OnGenButtonClick 中的文件 "F:\HomeWork\Yr13\Extended Project\Notepad++\Python27\Programs\GUI{c} menu+check+gen+Nth.py",第 224 行 n= str(Prime_Generation(Prime_Gen.entryVariable5.get(),Prime_Gen.entryVariable6.get())) 文件 "C:\Python27\lib\lib-tk\Tkinter.py",第 1845 行,在 getattr 中 return getattr(self.tk, 属性) 属性错误:entryVariable5

如有任何帮助,我们将不胜感激。 我已经在这个问题上坚持了三天,并尝试通过使用不同的函数和名称来解决这个问题,但错误仍然存​​在

import Tkinter             
from Tkinter import *
import math                


def SoS(limit):

    numbers = range(3, limit+1, 2)
    half = (limit)//2
    initial = 4

    for step in xrange(3, limit+1, 2):

        for i in xrange(initial, half, step):
           numbers[i-1] = 0
        initial += 2*(step+1)

        if initial > half:
            plist = [2] + filter(None, numbers)
            return plist         

            break


def S(m):

    sieve = [True] * m

    for i in xrange(3,(int(m**0.5)+1),2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((m-i*i-1)/(2*i)+1)

    plist = [2] + [i for i in xrange(3,m,2) if sieve[i]]
    return plist


def OTS(n):

    n, correction = n-n%6+6, 2-(n%6>1)
    sieve = [True] * (n/3)

    for i in xrange(1,(int(n**0.5)/3)+1):
      if sieve[i]:
        k=3*i+1|1
        sieve[      k*k/3      ::2*k] = [False] * ((n/6-k*k/6-1)/k+1)
        sieve[k*(k-2*(i&1)+4)/3::2*k] = [False] * ((n/6-k*(k-2*(i&1)+4)/6-1)/k+1)

    plist = [2,3] + [3*i+1|1 for i in xrange(1,n/3-correction) if sieve[i]]
    return plist


def is_prime(num):

    if num <= 3:
        if num <= 1:
            return False
        return True

    if not num % 2 or not num % 3:
        return False

    for i in xrange(5, int(num ** 0.5) + 1, 6):   
        if not num % i or not num % (i + 2):
            return False

    return True


def is_prime_multiple(Lower,Upper):
    NumberList = dict()

    if Lower%2 == 1:
        for i in xrange(Lower, Upper,2):
            NumberList[i] = is_prime(i)
    else:
       for i in xrange(Lower-1,Upper,2):
            NumberList[i] = is_prime(i)

    NumberList[1] = False

    return [i for i in NumberList if NumberList[i] == True]


def Prime_Generation(L,U):                                                          
    Lower = int(L)
    Upper = int(U)                                                         

    if Lower == 1:
        if Upper < 92:
            print SoS(Upper)

        if Upper >= 92 and Upper < 2250:
            print S(Upper)

        if Upper >= 2250 :
            print OTS(Upper)
    else:
        print sorted(is_prime_multiple(Lower,Upper))


def factors(n):

    f = 3
    fs = []

    while n % 2 == 0:
        fs.append(2)
        n /= 2

    while f*f <= n:
        while n % f == 0:
            fs.append(f)
            n /= f
        f += 2

    if n > 1:
        fs.append(n)

    return fs 


def Prime_Checker(N):                                                          
    NStr = str(N)
    N = int(N)                                                              
    Nfs = factors(N)
    for i in Nfs:
        if i != N:
            NfsStr = str(Nfs).strip('[]')
            resultb = [NStr,' is not a prime. The prime factors of ',NStr,' are ',NfsStr]
            return resultb.join()

        else:
            return N,' is a prime. The prime factors of ',N ,' are ',N


def PrimeFinderLamda(n,limit):                                
    nums = range(3,limit,2)
    for i in range(2, int(limit**0.5)):
        nums = filter(lambda x: x == i or x % i, nums)
    return [2]+nums


def NthPrime(N):
    N = int(N)
    Lower = 1
    limit = N*N
    if N == 1:
        return 2
    else:
        return PrimeFinderLamda(N,limit)[N-1]




class Prime_app_tk(Tkinter.Tk):            
    def __init__(self,parent):
        Tk.__init__(self,parent)
        self.parent = parent     

        self.initialize()

def Prime_Gen_Win(self):
    Prime_Gen = Toplevel()

    Prime_Gen.grid()

    Prime_Gen.labelVariable3 = StringVar()                                          
    Title_label2 = Label(Prime_Gen,textvariable=Prime_Gen.labelVariable3,
                        relief = RAISED,fg="black",bg="white"
                        ,font = "Arial")                                          

    Title_label2.grid(column=0,row=0,columnspan=4)
    Prime_Gen.labelVariable3.set(u"Please enter the upper and lower limits of the prime number generation")

    Prime_Gen.labelVariable4 = StringVar()                           
    SubTitle_label1 = Label(Prime_Gen,textvariable=Prime_Gen.labelVariable4,fg="black",bg="white")                        
    SubTitle_label1.grid(column=0,row=1,columnspan=4)
    Prime_Gen.labelVariable4.set(u"(Please enter values no greater than 10 million)")

    Prime_Gen.entryVariable5 = StringVar()                                               
    Prime_Gen.entry = Entry(Prime_Gen,textvariable=Prime_Gen.entryVariable5)
    Prime_Gen.entry.grid(column=0,row=4)
    Prime_Gen.entryVariable5.set(u"Lower.")

    Prime_Gen.entryVariable6 = StringVar()                                               
    Prime_Gen.entry = Entry(Prime_Gen,textvariable=Prime_Gen.entryVariable6)
    Prime_Gen.entry.grid(column=0,row=5)
    Prime_Gen.entryVariable6.set(u"Upper.")

    Genbutton = Button(Prime_Gen,text=u"Generate !",command=self.OnGenButtonClick   #placing and aesthetics of button
                       ,bg="yellow",relief=RAISED,padx=10,pady=10
                       ,activebackground="red",activeforeground="white")                  
    Genbutton.grid(column=0,row=6)

    scrollbar = Scrollbar(Prime_Gen)
    scrollbar.grid(column=1,row=8,sticky="ns")        

    Prime_Gen.Result_label = Text(Prime_Gen, yscrollcommand=scrollbar.set 
                         ,fg="blue",bg="white",wrap=WORD
                         ,width=100,relief = SUNKEN) 

    Prime_Gen.Result_label.grid(column=0,row=8,columnspan=2)

    scrollbar.config(command=Prime_Gen.Result_label.yview)

    Prime_Gen.labelVariable = StringVar()                           
    SubTitle_label = Label(Prime_Gen,textvariable=Prime_Gen.labelVariable,fg="black",bg="white")                        
    SubTitle_label.grid(column=0,row=9,columnspan=4)
    Prime_Gen.labelVariable.set(u"To see full list please click on the results\n and use the up and down arrows to scroll through the list")



    Prime_Gen.grid_columnconfigure(0,weight=1)        
    Prime_Gen.resizable(True,True)
    Prime_Gen.update()
    Prime_Gen.geometry(Prime_Gen.geometry())       
    Prime_Gen.entry.focus_set()
    Prime_Gen.entry.selection_range(0, Tkinter.END)

def OnGenButtonClick(Prime_Gen):
    n= str(Prime_Generation(Prime_Gen.entryVariable5.get(),Prime_Gen.entryVariable6.get()))
    Prime_Gen.Result_label.insert(END,"\nPrimes Found\n")
    Prime_Gen.Result_label.insert(END,n)
    Prime_Gen.entry.focus_set()
    Prime_Gen.entry.selection_range(0, Tkinter.END)

def Prime_Check_Win(self):
    Prime_Check = Toplevel()


    Prime_Check.grid()

    Prime_Check.labelVariable8 = StringVar()                                               
    Title_label3 = Label(Prime_Check,textvariable=Prime_Check.labelVariable8,
                        relief = RAISED,fg="black",bg="white"
                        ,font = "Arial")                                                

    Title_label3.grid(column=0,row=0,columnspan=4)
    Prime_Check.labelVariable8.set(u"Please enter a Number to be checked for primality")

    Prime_Check.labelVariable9 = StringVar()                           
    SubTitle_label3 = Label(Prime_Check,textvariable=Prime_Check.labelVariable9,fg="black",bg="white")                        
    SubTitle_label3.grid(column=0,row=1,columnspan=4)
    Prime_Check.labelVariable9.set(u"(Please enter values no greater than 10 million)")

    Prime_Check.entryVariable = StringVar()                                                               
    Prime_Check.entry = Entry(Prime_Check,textvariable=Prime_Check.entryVariable)
    Prime_Check.entry.grid(column=0,row=2)
    Prime_Check.entryVariable.set(u"Enter Number here.")

    Checkbutton = Button(Prime_Check,text=u"Check !",command=self.OnCheckButtonClick  
                       ,bg="blue",fg="white",relief=RAISED,padx=10,pady=10
                       ,activebackground="red",activeforeground="white")                        
    Checkbutton.grid(column=0,row=4)

    Prime_Check.labelVariable10 = StringVar()
    Result_label2 = Message(Prime_Check,textvariable=Prime_Check.labelVariable10           
                         ,anchor="w",fg="blue",bg="white"
                         ,width=500,relief = SUNKEN,padx=3,pady=3)                    
    Result_label2.grid(column=0,row=5,columnspan=2,rowspan=100)
    Prime_Check.labelVariable10.set(u"Hello")



    Prime_Check.grid_columnconfigure(0,weight=1)        
    Prime_Check.resizable(True,False)
    Prime_Check.update()
    Prime_Check.geometry(Prime_Check.geometry())       
    Prime_Check.entry.focus_set()
    Prime_Check.entry.selection_range(0, Tkinter.END)

def OnCheckButtonClick(Prime_Check):
    Prime_Check.labelVariable10.set(Prime_Checker(Prime_Check.entryVariable.get()))         #Had to call on prime gen and display results
    Prime_Check.entry.focus_set()
    Prime_Check.entry.selection_range(0, Tkinter.END)

def Nth_Prime_Win(self):                      
    Nth_Prime = Toplevel()

    Nth_Prime.grid()

    Nth_Prime.labelVariable12 = StringVar()                           
    Title_label = Label(Nth_Prime,textvariable=Nth_Prime.labelVariable12,
                        relief = RAISED,fg="black",bg="white"
                        ,font = "Arial")                        

    Title_label.grid(column=0,row=0,columnspan=4)
    Nth_Prime.labelVariable12.set(u"Please enter the Nth prime you would like to find")

    Nth_Prime.labelVariable13 = StringVar()                           
    SubTitle_label = Label(Nth_Prime,textvariable=Nth_Prime.labelVariable13,fg="black",bg="white")                        
    SubTitle_label.grid(column=0,row=1,columnspan=4)
    Nth_Prime.labelVariable13.set(u"(Please enter values no greater than 664579")

    Nth_Prime.entryVariable = StringVar()                            
    Nth_Prime.entry = Entry(Nth_Prime,textvariable=Nth_Prime.entryVariable)
    Nth_Prime.entry.grid(column=0,row=4)
    Nth_Prime.entryVariable.set(u"Enter Number here.")

    Genbutton = Button(Nth_Prime,text=u"Generate !",command=self.OnButtonNthClick  
                       ,bg="green",relief=RAISED,padx=10,pady=10
                       ,activebackground="red",activeforeground="white")   
    Genbutton.grid(column=0,row=5)

    Nth_Prime.labelVariable14 = StringVar()
    Result_label = Message(Nth_Prime,textvariable=Nth_Prime.labelVariable14           
                         ,anchor="w",fg="blue",bg="white"
                         ,width=1000,relief = SUNKEN,justify=LEFT,padx=3,pady=3)    

    Result_label.grid(column=0,row=6,columnspan=2,rowspan=100)
    Nth_Prime.labelVariable14.set(u"Hello")



    Nth_Prime.grid_columnconfigure(0,weight=1)        
    Nth_Prime.resizable(False,False)                    
    Nth_Prime.update()
    Nth_Prime.geometry(Nth_Prime.geometry())       
    Nth_Prime.entry.focus_set()
    Nth_Prime.entry.selection_range(0, Tkinter.END)

def OnButtonNthClick(Nth_Prime):
    Nth_Prime.labelVariable14.set(NthPrime(Nth_Prime.entryVariable.get()))         
    Nth_Prime.entry.focus_set()
    Nth_Prime.entry.selection_range(0, Tkinter.END)


def initialize(self):                      
    self.grid()

    self.labelVariable1 = StringVar()                           
    Title_label1 = Label(self,textvariable=self.labelVariable1,
                        relief = RAISED,fg="black",bg="white"
                        ,font = "Arial")                        

    Title_label1.grid(column=0,row=0,columnspan=4)
    self.labelVariable1.set(u"Welcome to the Prime Program")

    self.labelVariable2 = StringVar()                           
    SubTitle_label = Label(self,textvariable=self.labelVariable2,fg="black",bg="white")                        
    SubTitle_label.grid(column=0,row=1,columnspan=4)
    self.labelVariable2.set(u"(Please select the function you would like to use)")


    PrimeGenbutton = Button(self,text=u"Find Primes between 2 limits !",command=self.Prime_Gen_Win         
                       ,bg="yellow",relief=RAISED,padx=10,pady=10
                       ,activebackground="red",activeforeground="white")                                          
    PrimeGenbutton.grid(column=0,row=3)

    PrimeCheckbutton = Button(self,text=u"Check if a number is prime !",command=self.Prime_Check_Win  
                       ,bg="blue",fg="white",relief=RAISED,padx=14,pady=10
                       ,activebackground="red",activeforeground="white")   
    PrimeCheckbutton.grid(column=0,row=4)

    NthPrimebutton = Button(self,text=u"Find the Nth prime !",command=self.Nth_Prime_Win  
                       ,bg="green",relief=RAISED,padx=35,pady=10
                       ,activebackground="red",activeforeground="white")   
    NthPrimebutton.grid(column=0,row=5)      


    self.grid_columnconfigure(0,weight=1)        
    self.resizable(False,False)
    self.update()
    self.geometry(self.geometry())       




if __name__ == "__main__":
    app = Prime_app_tk(None)
    app.title('Prime Program')
    app.mainloop()

您的代码无法快速修复。它试图成为面向对象的,但这样做是不正确的。您需要正确定义您的方法,还应遵守 PEP8 命名约定——具体来说,方法和函数应以小写字母开头,而 类 应以大写字母开头。因为您不遵循 PEP8,并且由于您使用 Prime_Gen 在不同时间表示不同事物的奇怪方式,您的代码难以理解。

问题的症结在于OnGenButtonClick里面,Prime_Gen并不是你想的那样。它是 Prime_app_tk 的一个实例,而不是您在 Prime_Gen_Win 中设置局部变量 Prime_Gen 的值。因此,您分配给原始 Prime_Gen 的任何属性在另一个 Prime_Gen 中都不存在。

原因是按钮是这样定义的:

Genbutton = Button(..., command=self.OnGenButtonClick, ...)

在此上下文中,selfPrime_app_tk 的实例,因此它成为传递给 OnGenButtonClick 的参数。在该函数中,您调用参数 Prime_Gen,尽管通用约定将其命名为 self。这会导致代码混乱,因为在创建顶层 window.

的代码中还有一个名为 Prime_Gen 的局部变量