python中tkinter的text文本窗口写入数据过大会卡顿
本帖最后由 w759003376 于 2024-2-20 10:06 编辑问题:想实现把图片转为base64编码,并用python中tkinter的text文本模块接收,但是base64数据较大造成GUI窗口卡顿,也分别利用线程去执行或者利用after刷新去慢慢写入,最终还是会卡顿。
想了解的点:
1.是否tkinter中text文本组件本身就无法接收大数据,有大量数据过来一定会卡顿,无法解决
2.如果有解决方案,应该是怎样的思路解决了
代码
import base64
import tkinter
import threading
from tkinter.scrolledtextimport ScrolledText
class Test():
def __init__(self):
self.file = "1.jpg"
root=tkinter.Tk()
root.geometry("300x400+400+400")
root.title("测试")
button=tkinter.Button(root,text="图片转换base64",height=5,width=15,command=self.base64_img1)
button.pack()
self.Ent = tkinter.Text(root, height=10, width=20)
self.Ent.pack()
# self.Ent = tkinter.scrolledtext.ScrolledText(root,height=10,width=20)
# self.Ent.pack()
root.mainloop()
def base64_img1(self):
t1=threading.Thread(target=self.base64_img)
t1.start()
def base64_img(self):
f=open(self.file,"rb") #转为二进制格式
base64_data = base64.b64encode(f.read()).decode("utf-8")#使用base64进行加密
f.close()
if self.file.endswith('.png'):
base64_data = 'data:image/png;base64,' + base64_data
elif self.file.endswith('.jpg') or self.file.endswith('.jpeg'):
base64_data = 'data:image/jpeg;base64,' + base64_data
elif self.file.endswith('.gif'):
base64_data = 'data:image/gif;base64,' + base64_data
elif self.file.endswith('.webp'):
base64_data = 'data:image/webp;base64,' + base64_data
self.Ent.insert(tkinter.END,base64_data)
#print(base64_data)
if __name__=='__main__':
Test() 直接写到文件里吧,你想想微软原生的记事本打开大文件都卡,何况你这是tk 塞北的雪 发表于 2024-2-20 10:13
直接写到文件里吧,你想想微软原生的记事本打开大文件都卡,何况你这是tk
记事本会卡貌似是设计问题,记事本打开大文件会一次性按照窗口尺寸给全部文本换行,据说win11的记事本重构优化了,不过我没看出来打开快了多少({:301_1001:} 貌似很多GUI的输入框粘贴大文本都有这种问题,或许是GUI设计问题? 塞北的雪 发表于 2024-2-20 10:13
直接写到文件里吧,你想想微软原生的记事本打开大文件都卡,何况你这是tk
看了别人用c#写的窗口程序,就不会卡,tk在这方面真的这么不行嘛{:1_907:} 用易语言得了 几分钟写出来 稳定不报错 新建一个线程执行任务就行了,这样不会导致GUI界面卡死 本帖最后由 hange13 于 2024-2-20 10:59 编辑
那他不能一下接受很大的数据,那就避免一次性插入大量数据导致的卡顿嘛
但是少量多次的话,速度又会慢一点,不知你能接受不 csv格式不行吗 w759003376 发表于 2024-2-20 10:37
看了别人用c#写的窗口程序,就不会卡,tk在这方面真的这么不行嘛
微软亲儿子怎么比,然后你可以把这些数据复制出来,然后你直接贴到编辑框里面去看看是否卡顿,不卡顿说明和控件关系不大,和界面有关的应该要用异步去做吧,你多线程开了,如果界面上还是在等待,结果不是差不多么。