-Thomas杨- 2023-02-05 13:16 采纳率: 50%
浏览 32
已结题

python Listbox插入数据导致GUI崩溃

我用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

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-05 13:30
    关注

    请采纳点击右侧采纳即可:
    代码将拖动的文件路径插入列表框时是在 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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月13日
  • 已采纳回答 2月5日
  • 创建了问题 2月5日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)