【问题标题】:Tkinter classes are confusing me (basic )Tkinter 课程让我感到困惑(基本)
【发布时间】:2013-12-04 02:40:18
【问题描述】:

我是 python 和一般编程的新手,我一直在尝试使用 Tkinter 制作一个简单的 GUI 程序,但它没有运行,我不明白我得到的错误?

错误是:GUI 实例没有属性“框架”

未定义全局名称“框架”。

我的代码,我删除了一些不必要的东西。

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)

网站弄乱了一些缩进。

【问题讨论】:

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


    【解决方案1】:

    将函数中的每个frame 更改为self.frame。它应该可以解决问题。这使它成为一个实例变量。

    当您在__init__ 中定义frame 时,您只是在该函数的范围内定义它,因此不能在其他函数中使用。

    如果您将其称为实例变量self.frame,则您的所有函数都将具有相同的变量,从self 参数传递。问题解决了!

    【讨论】:

    • 感谢您解决了问题,但我不明白为什么 GUI 不自行更新?
    • 那是一个单独的问题 :) 我很擅长上课,不幸的是我不太擅长 tkinter。但如果你觉得这个答案有帮助,请accept the answer
    【解决方案2】:

    __init__ 中,您需要将frame 设为类变量,将其设为self.frame,然后它可以在类中的任何位置使用

    它告诉你frame 没有定义,因为它只在__init__ 的范围内定义,而不是整个类

    更多关于Classes

    您的最后 3 行应如下所示:

    root = Tk()
    app = GUI(root)
    root.mainloop()
    

    【讨论】:

    • 感谢您解决了问题,但我不明白为什么 GUI 不自行更新?
    • @user3064033 看看我的回答你需要像我展示的那样在根目录上使用主循环
    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多