提问:
我用windnd模块做了个文件拖入获取路径的功能,想把获取到的路径插入到列表,但是GUI会崩溃,下面是原代码 求帮忙看看咋回事
import windnd import threading import tkinter as tk class TestGui: def __init__(self, init_window_name): self.init_window_name = init_window_name self.init_window_name.title("测试") self.init_window_name.geometry("580x340+600+350") self.scroll_y = tk.Scrollbar(self.init_window_name) self.scroll_y.grid(row=0, column=2, ipady=100) self.listbox1 = tk.Listbox(self.init_window_name, width=80, height=13, yscrollcommand=self.scroll_y.set) self.listbox1.grid(row=0, column=1,columnspan=1) self.scroll_y.config(command=self.listbox1.yview) self.listbox1.insert(tk.END, "99999") # 能正常插入列表框 """ 列表框及滚动条 """ self.hook_dropfiles = windnd.hook_dropfiles self.hook_dropfiles(self.listbox1, func=self.dragged_files) """ 文件拖动 """ def thread_it(self, func, *args): self.myThread = threading.Thread(target=func, args=args) self.myThread .setDaemon(True) self.myThread .start() def dragged_files(self,files): msg = '\n'.join((item.decode('gbk') for item in files)) print(msg) # 把文件拖进来后可以正常打印路径 self.listbox1.insert(tk.END, msg) # 但一插入列表 GUI就崩溃了 if __name__ == '__main__': init_window = tk.Tk() init_window.attributes("-topmost", 1) test_gui = TestGui(init_window) init_window.mainloop()
报了这个错误 :Fatal Python error: PyEval_RestoreThread: NULL tstate
Python runtime state: initialized
解答:
代码将拖动的文件路径插入列表框时是在 GUI 线程中进行的,但 windnd 模块在后台处理文件拖动事件,可能会导致 GUI 线程阻塞。
为了解决这个问题,可以使用 threading 模块在新线程中插入列表框,避免阻塞 GUI 线程:
def dragged_files(self,files): msg = '\n'.join((item.decode('gbk') for item in files)) print(msg) # 把文件拖进来后可以正常打印路径 self.thread_it(self.insert_to_listbox, msg) def insert_to_listbox(self, msg): self.listbox1.insert(tk.END, msg)
标签:name,python,GUI,init,window,tk,msg,Listbox,self From: https://www.cnblogs.com/dituirenwu/p/17093279.html