我是python和编程的新手,我一直在尝试使用Tkinter制作一个简单的GUI程序,但它没有运行,我不明白我得到的错误?
错误是:GUI实例没有属性'frame'
未定义全局名称“框架”。
我的代码,我删除了一些不必要的东西。
class GUI:
def __init__(self,master):
frame=Frame(master)
frame.pack()
self.master=master
now=datetime.datetime.now()
self.date=str(now.month)+':'+str(now.day)+':'+str(now.year)
self.time1=str(now.hour)+':'+str(now.minute)+':'+str(now.second)
temp=14
humidity=15
self.userinput=StringVar()
self.password=StringVar()
#self.geometry('250x250+200+200')
#self.title('Controller GUI')
date_label=Label(frame,text='Date : %s' %self.date)
time_label=Label(frame,text='Time: %s' %self.time1)
temp_label=Label(frame,text='Temperature: %d C'%temp)
hum_label=Label(frame,text='Humidity: %d%%'%humidity)
EnterMail=Label(frame,text='Enter Gmail username:')
EnterPass=Label(frame,text='Enter password:')
self.mail_box=Entry(frame,textvariable=self.userinput)
self.pass_box=Entry(frame,textvariable=self.password)
self.EnterButton=Button(frame,text='Enter',command=self.printer)
self.StartAlarm=Button(frame,text='Start Alarm',command=self.startalarm)
self.StopAlarm=Button(frame,text='Stop Alarm',command=self.stopalarm)
date_label.grid(row=0,column=0,sticky=W)
time_label.grid(row=0,column=2,sticky=E)
temp_label.grid(row=1,column=0,sticky=W)
hum_label.grid(row=1,column=2,sticky=E)
EnterMail.grid(row=4,column=0,sticky=W)
EnterPass.grid(row=5,column=0,sticky=W)
self.mail_box.grid(row=4,column=2)
self.pass_box.grid(row=5,column=2)
self.EnterButton.grid(row=7,column=0)
self.StartAlarm.grid(row=8,column=0)
self.StopAlarm.grid(row=10,column=0)
mainloop()
def startalarm(self):
alarmlabel=Label(self.frame,text='Alarm Activated')
alarmlabel.grid(row=11,column=0)
GPIO.output(18,GPIO.HIGH)
return
def stopalarm(self):
alarmlabel=Label(frame,text='Alarm Deactivated')
alarmlabel.grid(row=11,column=0)
GPIO.output(18,GPIO.LOW)
return
def printer(self): # prints user input
self.username=self.userinput.get()
self.MailPass=self.password.get()
print username
print MailPass
mail = int(feedparser.parse("https://" + self.username + ":" +
self.MailPass +"@mail.google.com/gmail/feed/atom")["feed"]["fullcount"])
mail_label=Label(frame,text='Email: %d unread emails' %self.mail)
mail_label.grid(row=2,column=0,sticky=W)
return
root=Tk()
app=GUI(master=root)
该网站搞砸了一些缩进。
答案 0 :(得分:0)
将您的函数中的每个frame
更改为self.frame
。它应该解决问题。这使它成为一个实例变量。
当你在frame
中定义__init__
时,你只是在该函数的范围内定义它,因此不能在其他函数中使用。
如果将其称为实例变量self.frame
,则所有函数都将具有相同的变量,从self
参数传递。解决了问题!
答案 1 :(得分:0)
__init__
你需要通过frame
使self.frame
成为一个类变量,那么它可以在类中的任何地方使用
它告诉你frame
没有被定义,因为它的ony在__init__
的范围内定义而不是整个类
更多关于Classes
你的最后3行应如下所示:
root = Tk()
app = GUI(root)
root.mainloop()