Tkinter课让我感到困惑(基本)

时间:2013-12-04 02:40:19

标签: python tkinter raspberry-pi tk object-oriented-analysis

我是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)
该网站搞砸了一些缩进。

2 个答案:

答案 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()