【发布时间】:2017-11-16 02:24:24
【问题描述】:
我正在做一个很多人以前做过的相当简单的项目。这是我的硬件设置:
Raspberry Pi 3 带 16GB SD 卡
DHT11温湿度传感器
树莓派 7" 显示器
我正在将 Tkinter 与 Python 2.7 和 Adafruit_DHT 库一起使用。
代码很基础
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()
它工作得很好,只是它会导致内存泄漏。我确信它会通过“win.after(1000, read_every_second) 调用强制执行无限循环,但是我不知道如何解决它。
任何帮助将不胜感激。
【问题讨论】:
-
您正在为每次阅读创建三个新标签。为什么不换旧的?
-
你能举个例子吗?
-
感谢您的信息,但这是内存链接的来源吗?怎么样?
-
是的,创建任何新的小部件都会消耗内存。 Klaus D 和 Lafexlos 所说的是,您应该尝试更改标签文本而不是创建新的小部件。之后,再次运行您的程序以验证增加的内存消耗率是否降低。
标签: python tkinter memory-leaks raspberry-pi raspbian