2

私は、別のpythonクラスに保存されたデータを読み取ってインターフェースの値を更新する単一ウィンドウのtkinterアプリケーションを持っています。従来の MVC 構造のビューとコントローラーを多少マージしました。GUI は、ウィジェット タイプ、グリッド内のその XY 位置、およびその他のいくつかのパラメーターを記述する dict を反復処理することによって描画されます。

ユーザーが OptionMenus の 1 つからオプションを選択するか、エントリ ウィジェットに値を入力すると、Model クラスに格納されている値を更新するために「コマンド」属性が使用されます。ユーザーが「適用」ボタンをクリックすると、モデルが JSON に変換され、HTTP 経由で送信されて別のハードウェアが構成されます。

データには 2 つの「バンク」があり、どちらも同じパラメーターを持ちますが、異なる構成にすることができます。これを処理するために、ディスプレイを更新して他のバンクからの値を表示するボタンがあります。リモート ハードウェアの現在の値が更新されると、GUI も更新されます。

私がこれを達成した現在の方法は、メイン ウィンドウ内に Frame を作成し、すべてのウィジェットをこの中に配置することです。GUI を更新する必要がある場合は、メイン フレームのすべての子を削除するループを実行します。

for child in self.mainFrame.winfo_children():
    child.grid_forget()
    child.destroy()
    del child

次に、フレーム自体を削除します。

self.mainFrame.grid_forget()
self.mainFrame.destroy()
del self.mainFrame

これはすべて、ボタンがクリックされたときに呼び出される GUI クラスのメソッド内で行われます。次にself.drawGUI()メソッドが呼び出され、モデルからデータが再度読み取られ、すべての新しいウィジェットが新しいフレームに描画されます。

私が抱えている問題は、「更新」ボタンをクリックしてこのメ​​ソッドを実行するたびに、古いウィジェットが削除されていないかのように、メモリ使用量が約 500KB 増加することです。gc.collect()ループのさまざまなポイントで試しましたが、うまくいきませんでした。ウィジェットを正しく逆参照していますか? なぜ彼らは消えないのですか?

追加情報:ウィジェットを作成しているときに変数に割り当てられていないため、次のように関数を呼び出します。

Tk.Button(...)

それよりも

button = Tk.Button(...)

これが違いを生むかどうかはわかりません。前もって感謝します!

4

0 に答える 0