2017-06-14 2 views
0

Je fais un projet assez facile que beaucoup ont fait auparavant. Voici ma configuration matérielle:Tkinter fuite de mémoire

Raspberry Pi 3 w/16 Go carte SD

DHT11 Température du capteur d'humidité

Raspberry Pi 7" Affichage

J'utilise Tkinter avec Python 2.7 et bibliothèque Adafruit_DHT.

Le code est très basique

from Tkinter import * 
import tkFont 
import Adafruit_DHT 
import sys 
import time 

temp = 0 

win = Tk() 
win.title("Temperature") 

sans = tkFont.Font(family='FreeSansBold', size=28, weight=tkFont.BOLD) 

Label(win, text="Temperature", relief=SUNKEN, width=15, font=sans).grid(row=0, column=0) 
Label(win, text="Humidity", relief=SUNKEN, width=15, font=sans).grid(row=1, column=0) 
Label(win, text="Date/Time", relief=SUNKEN, width=15, font=sans).grid(row=2, column=0) 

def READ(): 
    global temp 
    humidity, temperature = Adafruit_DHT.read_retry(11, 4) 
    temp = temperature*9/5.0 + 32 
    Label(win, text=temp, relief=RIDGE, width=15, fg="black", bg="white", font=sans).grid(row=0, column=1) 
    Label(win, text=humidity, relief=RIDGE, width=15, fg="black", bg="white", font=sans).grid(row=1, column=1) 
    Label(win, text=time.strftime("%b %d %I:%M"), relief=RIDGE, width=15, fg="black", bg="white", font=sans).grid(row=2, column=1) 

def read_every_second(): 
    READ() 
    win.after(1000, read_every_second) 

win.after(1000, read_every_second) 

mainloop() 

Cela fonctionne très bien, sauf qu'il provoque une fuite de mémoire. Je suis sûr qu'il oblige les boucles sans fin avec le « win.after (1000, read_every_second) appeler cependant, je ne sais pas comment le résoudre.

Toute aide serait appréciée.

+2

Vous créez trois nouvelles étiquettes pour chaque lecture. Pourquoi ne pas changer les anciens? –

+0

Pour modifier le texte d'une étiquette, voir: [Modifier le texte d'une étiquette] (https://stackoverflow.com/questions/17125842/changing-the-text-on-a-label) ou [Comment modifier le texte de l'étiquette Tkinter appuyez sur le bouton] (https://stackoverflow.com/questions/29828477/how-to-change-tkinter-label-text-on-button-press) – Lafexlos

+0

pouvez-vous donner un exemple? –

Répondre

0

Merci à tous ceux qui posté ...

J'ai complètement retravaillé mon code et éliminé la fuite.

Je ne suis pas un programmeur accompli mais je signale que d'autres puissent se faire une idée de ce que je faisais (avec d'autres aider) à faire fonctionner ce projet

from Tkinter import * 
import Adafruit_DHT 
import time 
import tkFont 
from PIL import ImageTk, Image 

master = Tk() 

sans = tkFont.Font(family='FreeSansBold', size=52) #weight=tkFont.BOLD) 
#sans = tkFont.Font(family='Roboto', size=52) 
dkblue = '#0b1c3c' 

master.geometry("700x400") 
master.configure(background=dkblue) 

temperature = 0 
humidity = 0 

original = Image.open("./Downloads/fish.png") 
resized = original.resize((100, 100), Image.ANTIALIAS) 
image = ImageTk.PhotoImage(resized) 


m1 = Label(master, text = 'Temp ', bg = dkblue, fg = 'yellow', font = sans)#, relief = RIDGE, borderwidth = 5) 
m1.grid(row = 0, column = 0, sticky = E) 

w1 = Label(master, text= temperature, bg = dkblue, fg = 'white', font = sans) 
w1.grid(row = 0, column = 1, sticky = W) 

m2 = Label(master, text = 'Humid ', bg = dkblue, fg = 'yellow', font = sans)#, relief = RIDGE, borderwidth = 5) 
m2.grid(row = 1, column = 0, sticky = E) 

w2 = Label(master, text = humidity, bg = dkblue, fg = 'white', font = sans) 
w2.grid(row = 1, column = 1, sticky = W) 

t1 = Label(master, text = 'Date ', bg = dkblue, fg = 'yellow', font = sans) 
t1.grid(row = 2, column = 0, sticky = E) 

t2 = Label(master, text = time.strftime('%b %d'), bg = dkblue, fg = 'white', font = sans) 
t2.grid(row = 2, column = 1, sticky = W) 

t3 = Label(master, text = 'Time ', bg = dkblue, fg = 'yellow', font = sans) 
t3.grid(row = 3, column = 0, sticky = E) 

t3 = Label(master, text = time.strftime('%I:%M:%S'), bg = dkblue, fg = 'white', font = sans) 
t3.grid(row = 3, column = 1, sticky = W) 

imglabel = Label(master, image=image, bg = dkblue) 
imglabel.grid(row = 0, column = 2, sticky = E) 

def CHANGE(): 
    global temperature 
    global humidity 
    humidity, temperature = Adafruit_DHT.read_retry(11, 4) 
    temperature = (temperature * 9/5.0 + 32) 
    w1.config(text = temperature) 
    w2.config(text = humidity) 
    t2.config(text = time.strftime('%b %d')) 
    t3.config(text = time.strftime('%I:%M:%S')) 
    master.after(2000, CHANGE) 

master.after(2000, CHANGE) 

mainloop()