gpt4 book ai didi

multithreading - 使用线程和Tkinter时发生内存泄漏

转载 作者:行者123 更新时间:2023-12-03 13:10:12 25 4
gpt4 key购买 nike

我已经从事了一段时间的“游戏”。它运行良好,除了在没有完成游戏的情况下关闭GUI时,它仍在后台运行(就像内存泄漏一样,即使“真正的”内存泄漏无法正常工作)。

该游戏在两个线程上运行(或理论上应该运行),一个用于GUI,另一个用于游戏本身,经过一些研究,我发现我可以在根窗口小部件上使用.protocol()方法执行raise SystemExit以确保所有线程当GUI关闭时被终止。但这似乎行不通,我也不知道为什么。这是代码:

# -*- coding: UTF-8 -*-
from tkinter import Tk, Label, Entry, Button, W, E, END
from threading import Thread
from random import randint
class GUI(Thread):
tentativas = []
def __init__(self):
Thread.__init__(Thread)
self.start()
self.valor = randint(0, 100)
self.vidas = 6
self.venceu = False
self.entry, self.aux = -128, -128
while self.vidas > 0:
self.vidas -= 1
while True:
if self.entry != self.aux:
break
self.aux = self.entry
if self.entry == self.valor:
self.txt01.config(text = "Congrats, you won!", fg = "green")
self.venceu = True
self.txt02.config(text = '')
break
elif self.entry > self.valor:
self.txt01.config(text = 'Too big, try again.')
else:
self.txt01.config(text = 'Too small, try again.')
self.txt02.config(text = str(self.vidas) + ' Chances restantes.')
if self.venceu != True:
self.txt01.config(text = 'You ran out of lives, game over!')
self.txt02.config(text = 'The number was ' + str(self.valor) + '.')
def run(self):
self.root = Tk()
self.root.title("Lottery")
self.txt00 = Label(self.root, text = "Welcome, insert a number ranging from 0 to 100:")
self.txt00.grid(sticky = W, columnspan = 4)
self.txt01 = Label(self.root, text = " ")
self.txt01.grid(row = 1, column = 0, columnspan = 4, sticky = W)
self.txt02 = Label(self.root, text ="6 Tentativas restantes.")
self.txt02.grid(row = 4, columnspan = 2, sticky = E)
self.inp00 = Entry(self.root)
self.inp00.grid(row = 2,columnspan = 2,column = 1,sticky = W)
self.but00 = Button(self.root, text = "Try!", command = self.chutar)
self.root.bind("<Return>", self.chutar)
self.but00.grid(row = 2, column = 3)
self.root.protocol("WM_DELETE_WINDOW", self.killGUI)
self.root.mainloop()
def chutar(self, args = None):
self.pular = True
try:
self.chute = int(self.inp00.get())
except ValueError:
self.txt01.config(text = "Invalid entry, try again!", fg = "red")
self.pular = False
finally:
self.inp00.delete(0, END)
if self.pular:
if self.chute in range(101) and self.chute not in self.tentativas:
self.entry = self.chute
self.tentativas.append(self.entry)
else:
self.var = "Invalid entry, try again!"
self.txt01.config(text = self.var, fg = "red")
def killGUI(self):
raise SystemExit
k = GUI()

我真的不知道为什么“killGUI”功能不起作用,请帮帮我!

最佳答案

(据我所知,Tkinter不是线程安全的。这可能会导致此问题。因此,将线程与Tkinter一起使用并不是一个好主意。我什至不确定您是否真的需要多线程。)

编辑:似乎您只是以此杀死您的子线程,主线程仍在运行。

但是要解决您的问题,一种方法是强制“杀死”整个过程树。您只需要脚本pid和一个子流程函数即可。在您的killGUI中尝试以下代码:

def killGUI(self):
try:
subprocess.call(['taskkill', '/F', '/T', '/PID', str(os.getpid())])
print("Process killed: %s " % str(os.getpid()))
except Exception as ex:
print(ex)

这肯定会杀死您的线程。

关于multithreading - 使用线程和Tkinter时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36993785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com