解决tkinter 与 threading 结合使用后依然卡死问题的一种方法

解决Python 中Tkinter 与 threading 结合使用后依然卡顿,假死问题的一种方法

遇到的问题:
开启新线程,数据插入前不会卡,数据插入时会卡。
不开新线程,数据插入前会卡,数据插入基本秒过。

猜测原因:
向tkinter表格treeview中插入数据时,数据量过大(高I/O操作)的话就会导致GUI界面卡顿,假死。
尝试过threading 和_thread 依旧无法解决。
可能是新的线程与GUI主线程共同操作treeview导致冲突的,但开启线程锁Lock依旧无法解决。

解决方法:
开启新线程查询,操作到 insert 时 :
1、treeview.place_forget()
2、insert
3、treeview.place()

提示:使用pack布局的由于控件重新pack,界面可能会乱。

treeview 快速清空:
1、新开线程
2、treeview.place_forget()
3、执行delete
3、treeview.place()

PythonTkinter库中,特别是当使用`GridLayout`进行窗口布局管理时,如果你发现页面切换时程序出现了卡顿或冻结,那可能是因为布局操作在主线程中执行,而Tkinter的GUI操作默认是在主线程里同步进行的,这可能导致阻塞。 为了解决这个问题,你可以利用Python的多线程技术。一种常见的做法是,在事件触发时,比如用户点击按钮切换页面,创建一个新的线程来负责处理新的`GridLayout`设置。这样,布局计算可以在后台线程中异步完成,不会阻塞主线程。 例如: ```python from tkinter import * import threading class LayoutSwitcher(threading.Thread): def __init__(self, new_grid, parent_window): threading.Thread.__init__(self) self.new_grid = new_grid self.parent_window = parent_window def run(self): # 在新线程中设置新的网格布局 self.parent_window.gridconfigure(**self.new_grid) # 通知主线程完成并更新UI self.parent_window.event_generate('<<LayoutChanged>>') # 主程序部分 root = Tk() current_grid = {'column': 0, 'row': 0} # 当前网格配置 def switch_layout(): new_grid = {'column': 1, 'row': 1} # 新的网格配置 layout_thread = LayoutSwitcher(new_grid, root) layout_thread.start() switch_button = Button(root, text='切换', command=switch_layout) switch_button.pack() root.bind('<<LayoutChanged>>', lambda e: update_display()) # 更新显示的部分 # ... def update_display(): print("Layout changed and UI updated") # ... 其他窗口内容和逻辑 root.mainloop() ``` 在这个例子中,当切换布局的按钮被点击时,会启动一个新的`LayoutSwitcher`线程。线程在完成布局更改后生成一个特殊的事件`<<LayoutChanged>>`,主线程通过绑定这个事件来感知布局已经改变,然后调用`update_display()`来更新界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值