2017-05-08 19 views
0

請問您可以請我帶一個解決方案,我無法解決這個問題。AttributeError:'主畫面'對象沒有屬性'屬性'

我得到一個AttributeError:'主畫面'對象沒有屬性'屬性' 當我按下按鈕切換到全屏。 THX的幫助

#!/bin/python3 

import tkinter 
import grovepi 
import math 
import time 
from tkinter import Tk, Label, Button 

class mainscreen: 
    def __init__(self,master): 
    self.master = master 
    master.title ("Temperature") 
    master.geometry("800x480") 
    master.attributes("-fullscreen", False) 
    self.state = False 

    sensorTH1 = 4 
    sensorTH2 = 3 
    temp1=0 
    temp2=0 


    #column0 and 1 
    self.labeltemp11 = tkinter.Label (master, text="Temp inside", fg="black", font="72") 
    self.labeltemp11.grid(row=1, column=0 ,sticky="sw") 
    self.labeltemp1 =tkinter.Label (master, text="", fg="black", font="72") 
    self.labeltemp1.grid(row=1, column=1,sticky="sw") 
    self.labelhum11 = tkinter.Label(master, text="Hum inside", fg="black", font="72") 
    self.labelhum11.grid(row=2,column=0,sticky="sw") 
    self.labelhum1 = tkinter.Label (master, text="",fg="black", font="72") 
    self.labelhum1.grid(row=2, column=1,sticky="sw") 
    self.labeltemp22 = tkinter.Label (master, text="Temp outside", fg="black",font="72") 
    self.labeltemp22.grid(row=3, column=0,sticky="sw") 
    self.labeltemp2 = tkinter.Label (master, text="", fg="black", font="72") 
    self.labeltemp2.grid(row=3, column=1,sticky="sw") 
    self.labelhum22 = tkinter.Label(master, text="Hum outside", fg="black", font="72") 
    self.labelhum22.grid(row=4,column=0,sticky="sw") 
    self.labelhum2 = tkinter.Label (master, text="", fg="black", font="72") 
    self.labelhum2.grid(row=4, column=1,sticky="sw") 
    #win.focus_set() 
    #win.bind("t",toggle_fullscreen(win)) 
    self.button= tkinter.Button(master, text="No fullscreen", width=10,command=lambda:self.toggle_fullscreen()) 
    #works as well button= tkinter.Button(win, text="No Fullscreen", width=10,command=toggle_fullscreen) 
    self.button.grid(column=0,row=5,sticky="nsew") 

    #column2 empty 
    self.labelemp1 = tkinter.Label (master, text="", fg="black", width="10" ,bg="white" , font="72") 
    self.labelemp1.grid(row=0, column=2,sticky="sw") 
    self.labelemp2 = tkinter.Label (master, text="test", fg="black", width="10",bg="black" , font="72") 
    self.labelemp2.grid(row=0, column=3,sticky="sw") 



    def READ(toggle): 
     if toggle: 
     [temp1,humidity1] = grovepi.dht(sensorTH1,1) 
     self.labeltemp1.configure(text= "{value:6.2f} C".format(value=temp1)) 
     self.labelhum1.configure(text= "{value:6.2f} %".format(value=humidity1)) 
     print ("temp1 =", temp1, " humidity1 =", humidity1) #py3 

    else: 
     #time.sleep(1) 
     [temp2,humidity2] = grovepi.dht(sensorTH2,1) 
     self.labeltemp2.configure(text= "{value:6.2f} C".format(value=temp2)) 
     self.labelhum2.configure(text= "{value:6.2f} %".format(value=humidity2)) 
     print ("temp2 =", temp2, " humidity2 =", humidity2) #py3 


     toggle= not toggle 
     #print (toggle) 
     return(toggle) 






    def read_every_second(self): 
    #global readoneortwo not needed after object oriented programming 
    #win.attributes("-fullscreen", False) 
    #toggle_fullscreen(win) 
     readoneortwo=self.READ(readoneortwo) 
     master.after(1000, read_every_second) 

    # can be used with call of button lamda: toggle_fullscreen (win) or any other window? 
    #def toggle_fullscreen(self, event=None): 
    #  self.state = not self.state # Just toggling the boolean 
    #  print ("test") 
    #  self.attributes("-fullscreen", self.state) 
    #  return "break" 


    def toggle_fullscreen(self, event=None): 
     self.state = not self.state # Just toggling the boolean 
     if self.state: 
     self.button["text"]="No Fullscreen" 
     else: 
     self.button["text"]="Fullscreen" 
     self.attributes("-fullscreen", master.state) 
     return "break"  

if __name__ == '__main__': 
root = tkinter.Tk() 
win = mainscreen(root) 
#win.read_every_second() 
root.mainloop() 

如果我想運行win.read_every_second()我得到一個錯誤:

UnboundLocalError:局部變量 'readoneortwo' 分配之前引用

我被告知使用面向對象和類,所以我不需要全局變量,但似乎我做?

+0

在頂部,設置'master.attributes( 「 - 全屏」,假)',但在底部使用'self':'self.attributes(」 -fullscreen「,master.state)'。 – Evert

+1

很坦白地說,我不明白,因爲我是新的....我以爲self.master =主.. – Fredddd

回答

0

爲了解決這個問題,改變toggle_fullscreen如下:

def toggle_fullscreen(self, event=None): 
    self.state = not self.state # Just toggling the boolean 
    if self.state: 
     self.button["text"]="No Fullscreen" 
    else: 
     self.button["text"]="Fullscreen" 

    self.master.attributes("-fullscreen", self.state) 

    return "break"  

,注意變化self.state(從master.state)。

你寫:I was told to use object oriented and class so I do not need global variables , but it seems I do??

Using class you don't need global variables as long as you use the syntax self.someVariable = someValue. Every function of the class gets self passed as its first parameter making all the self.someVariable variables defined within the class available from within the function (as if they were "global").

+0

Thx克勞迪奧,我認爲這是程序員的最佳網站,我來到那麼遠:-)與答案發現這裏已經通過搜索... – Fredddd

相關問題