【问题标题】:Tkinter memory leakTkinter 内存泄漏
【发布时间】: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


【解决方案1】:

感谢发帖的人...

我已经彻底修改了我的代码并消除了泄漏。

我不是一个有成就的程序员,但是我发帖是为了让其他人可以了解我做了什么(在其他人的帮助下)以使这个项目工作。

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()

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    相关资源
    最近更新 更多