2017-04-03 186 views
1

我想让我的变量在我的标签更新,但遇到了一个问题,其中按钮的功能通过改变温度设置和下降0.5摄氏度工作,但标签上温度和所需的温度不会随着它变化。Python Tkinter变量标签不更新

我在python3.6

在这里工作是我的代码,我想知道是否有人也许能帮助我吗?

import os 
import glob 
import time 
import RPi.GPIO as GPIO 
from datetime import datetime 


#Set gpio's 
GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 
GPIO.setup(17,GPIO.OUT)#RED 
GPIO.setup(22,GPIO.OUT)#GREEN 
GPIO.setup(27,GPIO.OUT)#BLUE 


#grab temp probe information 
os.system('modprobe w1-gpio') 
os.system('modprobe w1-therm') 

base_dir = '/sys/bus/w1/devices/' 
device_folder = glob.glob(base_dir + '28*')[0] 
device_file = device_folder + '/w1_slave' 


# Read temperature from device 

def read_temp_raw(): 
    f = open(device_file, 'r') 
    lines = f.readlines() 
    f.close() 
    return lines 

def read_temp(): 
    lines=read_temp_raw() 
    while lines[0].strip()[-3:] != 'YES': 
     time.sleep(0.1) 
     lines = read_temp_raw() 
    equals_pos = lines[1].find('t=') 
    if equals_pos != -1: 
     temp_string = lines[1][equals_pos+2:] 
     temp_c = float(temp_string)/1000 
     #temp_f = temp_c * 9.0/5.0 + 32.0 
     return temp_c#, temp_f 


temp = read_temp() 
desiredtemp = 17 
deg = u'\xb0'#utf code for degree 


def increase(): 
    global desiredtemp 
    desiredtemp = desiredtemp + 0.5 
    print(desiredtemp) 

def decrease(): 
    global desiredtemp 
    desiredtemp = desiredtemp - 0.5 
    print(desiredtemp) 


#Tkinter start 

from tkinter import * 
root = Tk() 
#code to add widgets will go here.... 

topFrame = Frame(root) 
topFrame.pack(side=TOP) 

middleFrame = Frame(root) 
middleFrame.pack() 

bottomFrame = Frame(root) 
bottomFrame.pack(side=BOTTOM) 

#Set buttons 
button1 = Button(bottomFrame, text="Increase (0.5"+ deg +"C)", fg="black", command=increase) 
button2 = Button(bottomFrame, text="Decrease (0.5"+ deg +"C)", fg="black", command=decrease) 


#use to put buttons on screen 
button1.pack(side=LEFT) 
button2.pack(side=LEFT) 


#Set labels 
label1 = Label(topFrame, text="Desired Temp = ", fg="black") 
label2 = Label(middleFrame, text="Actual Temp = ", fg="black") 
label3 = Label(topFrame, text=desiredtemp, fg="black") 
label4 = Label(middleFrame, text=temp, fg="black") 


#use to put labels on screen 
label1.pack(side=LEFT) 
label2.pack(side=LEFT) 
label3.pack(side=LEFT) 
label4.pack(side=LEFT) 



root.mainloop() 

#Tkinter End 


# Open file to be logged 

file = open("/home/pi/Desktop/Templog.csv", "a") 

if os.stat("/home/pi/Desktop/Templog.csv").st_size == 0: 
    file.write("Date, Time, TemperatureSensor1\n") 




# Continuous print loop 
while True: 
    print(read_temp()) 
    if(read_temp()<desiredtemp): 
     GPIO.output(17,GPIO.LOW) 
     GPIO.output(22,GPIO.HIGH) 

    else: 
     GPIO.output(17,GPIO.HIGH) 
     GPIO.output(22,GPIO.LOW) 

    now = datetime.now() 
    file.write(str(now.day)+"-"+str(now.month)+"-"+str(now.year)+","+str(now.hour)+":"+str(now.minute)+":"+str(now.second)+","+str(read_temp())+"\n") 
    file.flush() 
    time.sleep(1) 
+0

我已经试过,但我不能让IntVar工作 –

回答

0

您可以使用StringVar给一个字符串变量与Label部件关联。您将StringVar作为textvariable关键字参数传递给Label,并在每个按钮回调中简单更新温度值,并使用set方法更新StringVar

例扩展自己的代码:

import os 
import glob 
import time 

from datetime import datetime 
from tkinter import * 

temp = 18 
desiredtemp = 17 
deg = u'\xb0' # utf code for degree 


def increase(): 
    global desiredtemp 
    desiredtemp += 0.5 
    tmpstr.set("%s" % desiredtemp) 


def decrease(): 
    global desiredtemp 
    desiredtemp -= 0.5 
    tmpstr.set("%s" % desiredtemp) 

root = Tk() 

topFrame = Frame(root) 
topFrame.pack(side=TOP) 

middleFrame = Frame(root) 
middleFrame.pack() 

bottomFrame = Frame(root) 
bottomFrame.pack(side=BOTTOM) 

button1 = Button(bottomFrame, text="Increase (0.5"+ deg +"C)", fg="black", command=increase) 
button2 = Button(bottomFrame, text="Decrease (0.5"+ deg +"C)", fg="black", command=decrease) 

button1.pack(side=LEFT) 
button2.pack(side=LEFT) 

tmpstr = StringVar(value="%s" % desiredtemp) 

label1 = Label(topFrame, text="Desired Temp = ", fg="black") 
label2 = Label(middleFrame, text="Actual Temp = ", fg="black") 
label3 = Label(topFrame, textvariable=tmpstr, fg="black") 
label4 = Label(middleFrame, text=temp, fg="black") 

label1.pack(side=LEFT) 
label2.pack(side=LEFT) 
label3.pack(side=LEFT) 
label4.pack(side=LEFT) 

root.mainloop() 

注意,使用global关键字通常被认为是一个code smell,这应该会让你考虑将所有这些元素融入到一类。

+0

谢谢你的帮助,这工作:)请你可以解释一下使用(“%s的”%desiredtemp)和如何工作的?或者指向我可以阅读的代码的使用方向。 –

+0

确定它只是字符串格式。更现代的方法是使用字符串的“格式”方法,例如' '{}'。格式(desiredtemp)'。我可能是一个使用'%'的老式学校,但在基本层面上,它也是一样。请参阅https://pyformat.info/了解关于这个主题的一些非常全面的信息。 –

+0

谢谢,我会看看那个。 我假设为了使temp = read_temp()更新我的标签,我必须使用crtmpstr = StringVar(value =“%s”%temp)并用crtmpstr替换temp中的标签? –