Утечка памяти при использовании richTextCtrl и wxPython - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблема с утечками памяти для приложения, использующего wxPython и wx.richtext.RichTextCtrl.Приложение похоже на это - простые цифровые часы на оконной раме .Чтобы сохранить код в чистоте, я использую другой модуль для обновления «текстового модуля» (ModuleClock.py).

Кто-нибудь, кто знает, почему он так себя ведет?

Я также пытался:

  • Замена richtext объектом StaticText (wx.StaticText). Результат: не использует память.
  • Нет вызова к ModuleClock.py. Результат: не использует память.
  • РЕДАКТИРОВАТЬ 1: Использование команд rto. Freeze () , rto. Оттепель() и rto. BeginSupressUndo ()
  • РЕДАКТИРОВАТЬ 2: Перемещение кода из ModuleClock.py в Main.py (внутри метода MainWindow.update)

Main.py

import wx
import wx.richtext # as rt
import ModuleClock         #
from datetime import datetime
import os
import psutil

class MainWindow(wx.Frame):
    counter = 0
    lastcall = datetime.now()

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, size=(600, 500), pos=(0, 0))

        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour('Black')

        self.clock = wx.richtext.RichTextCtrl(self.panel, wx.ID_ANY, value="", size = (600,150), style=wx.VSCROLL | wx.HSCROLL | wx.NO_BORDER)
        self.clock.SetBackgroundColour('Black')

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.update, self.timer)
        self.timer.Start(100)
        self.Show()

    def update(self, event):
        now = datetime.now()
        self.counter = self.counter + 1

        ModuleClock.update(self.clock)

        # Check memory use by process every 30 seconds
        if (now - self.lastcall).seconds > 30:
            process = psutil.Process(os.getpid())
            print('memory use =', process.memory_info().rss/1000, 'kb')
            self.lastcall = now


app = wx.App(False)
frame = MainWindow(None)
app.MainLoop()

ModuleClock.py

from datetime import datetime


def update(rto):
    now = datetime.now()

    # default is black text
    rto.Clear()
    rto.BeginFontSize(16)
    rto.BeginTextColour("White")
    rto.WriteText(now.strftime("%A %d %B\n"))
    rto.BeginFontSize(36)
    rto.WriteText(now.strftime("%H:%M:%S"))

Командная строкавывод

(venv) C:\Users\Danne\PycharmProjects\Leak>python Main.py
memory use = 31920.128 kb
memory use = 32657.408 kb
memory use = 33492.992 kb
memory use = 34144.256 kb
memory use = 34975.744 kb
memory use = 35545.088 kb
memory use = 36376.576 kb
[30 records removed]
memory use = 58028.032 kb
memory use = 58871.808 kb
memory use = 59404.288 kb
memory use = 60268.544 kb
memory use = 60801.024 kb
memory use = 61607.936 kb

1 Ответ

0 голосов
/ 03 декабря 2018

В ModuleClock вы никогда не отменяете изменения цвета текста или размера шрифта, т. Е. Для каждого Begin есть End
Изменение ModuleClock на:

from datetime import datetime


def update(rto):
    now = datetime.now()

    # default is black text
    rto.Clear()
    rto.BeginFontSize(16)
    rto.WriteText(now.strftime("%A %d %B\n"))
    rto.EndFontSize()
    rto.BeginFontSize(36)
    rto.WriteText(now.strftime("%H:%M:%S"))
    rto.EndFontSize()

и добавьте строку self.clock.BeginTextColour("White") после self.clock.SetBackgroundColour('Black') в Main.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...