鱼C论坛

 找回密码
 立即注册
查看: 1187|回复: 9

[求助] tkinter 文本框超长行卡顿,如何处理

[复制链接]
发表于 2024-5-19 09:10:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
from tkinter import *

test = 'Text()文本框使用滚动条后超长单行卡顿问题' * 1000

appForm = Tk()
appForm.title('测试窗口')
appForm.geometry('500x400')
y_scroll = Scrollbar(appForm)
y_scroll.pack(side=RIGHT,fill=Y)
textbox = Text(appForm,width=500,height=400)
y_scroll.config(command=textbox.yview)
textbox.config(yscrollcommand=y_scroll.set)
textbox.insert(INSERT,test)
textbox.pack()

appForm.mainloop()

本机 Python version 3.8.6  Tk version 8.6
能否不要使用换行符,或者分页,就在一行完全显示文本信息?最好是不要取消滚动条,难道真要换GUI吗?

捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-5-19 09:11:05 | 显示全部楼层
在tkinter中,文本框的卡顿是因为单行文本过长导致的。一种处理方法是使用`wrap='none'`属性来禁用换行,将文本框设置为横向滚动:

  1. textbox = Text(appForm, width=500, height=400, wrap='none')
复制代码


但这样会导致水平滚动条显示不全,需要调整窗口宽度以查看整个文本内容。

另一种方法是在文本框中加入一个内部框架,并设置框架的宽度和文本框的宽度相同,然后将文本框放置在框架中,以实现横向滚动而不影响其他组件。代码示例如下:

  1. from tkinter import *

  2. test = 'Text()文本框使用滚动条后超长单行卡顿问题' * 1000

  3. appForm = Tk()
  4. appForm.title('测试窗口')
  5. appForm.geometry('500x400')

  6. y_scroll = Scrollbar(appForm)
  7. y_scroll.pack(side=RIGHT, fill=Y)

  8. frame = Frame(appForm, width=500)
  9. frame.pack()

  10. textbox = Text(frame, width=500, yscrollcommand=y_scroll.set, wrap='none')
  11. textbox.pack(side=LEFT, fill=BOTH, expand=True)

  12. y_scroll.config(command=textbox.yview)
  13. textbox.insert(INSERT, test)

  14. appForm.mainloop()
复制代码


这样就可以在文本框中完整显示超长的单行文本,并且保留滚动条不受影响。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-19 09:20:09 | 显示全部楼层
我的意思是文本框显示效果还是按截图那样展示,而不是在一行显示。
上面回复的代码,是在一行显示,并且鼠标点击文本后按END键,窗体卡死……
捕获2.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-19 09:20:22 | 显示全部楼层
myjcn 发表于 2024-05-19 09:20
我的意思是文本框显示效果还是按截图那样展示,而不是 ...


非常抱歉误解了您的意思。如果您想保持文本框中的换行显示效果,并且避免卡顿问题,可以尝试以下方法:

使用`tkinter.scrolledtext`模块,它是`Text`的扩展类,内置了自动滚动条。代码示例如下:

  1. from tkinter import *
  2. from tkinter import scrolledtext

  3. test = 'Text()文本框使用滚动条后超长单行卡顿问题' * 1000

  4. appForm = Tk()
  5. appForm.title('测试窗口')
  6. appForm.geometry('500x400')

  7. textbox = scrolledtext.ScrolledText(appForm, width=500, height=400)
  8. textbox.insert(INSERT, test)
  9. textbox.pack()

  10. appForm.mainloop()
复制代码


通过使用`scrolledtext.ScrolledText`替代原来的`Text`,可以自动添加垂直和水平滚动条,以便显示超长文本。

希望这次能够满足您的需求,如果还有任何问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-19 09:24:31 | 显示全部楼层
还是不行,显示效果达到了,但是使用鼠标滚轮或者拖动滚动条,文本框内容刷新很慢给人卡顿的感觉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-19 09:24:41 | 显示全部楼层
myjcn 发表于 2024-05-19 09:24
还是不行,显示效果达到了,但是使用鼠标滚轮或者拖动 ...


非常抱歉您还是遇到了卡顿的问题。在处理大文本量时,tkinter的Text组件可能会出现性能问题。为了解决这个问题,可以使用第三方的文本编辑器,比如`tkinter.scrolledtext`模块结合`tkinter.ttk.Treeview`组件来实现类似的效果。

下面是一个示例代码,其中使用了`tkinter.scrolledtext.ScrolledText`和`ttk.Treeview`来展示长文本,并且滚动体验较为流畅:

  1. from tkinter import *
  2. from tkinter import scrolledtext, ttk

  3. test = 'Text()文本框使用滚动条后超长单行卡顿问题' * 1000

  4. appForm = Tk()
  5. appForm.title('测试窗口')
  6. appForm.geometry('500x400')

  7. # 创建Treeview的表头
  8. tree = ttk.Treeview(appForm)
  9. tree["columns"] = ("text") # 定义列名
  10. tree.column("text", width=500) # 设置列宽度
  11. tree.heading("text", text="Content") # 设置列标题

  12. # 将文本按照每80个字符分割成多个段落
  13. paragraphs = [test[i:i+80] for i in range(0, len(test), 80)]

  14. # 插入段落到Treeview中
  15. for i, paragraph in enumerate(paragraphs):
  16.     tree.insert(parent='', index='end', iid=i, values=(paragraph))

  17. # 创建垂直滚动条
  18. vsb = ttk.Scrollbar(appForm, orient="vertical", command=tree.yview)
  19. # 给Treeview绑定垂直滚动条
  20. tree.configure(yscrollcommand=vsb.set)
  21. # 布局Treeview和滚动条
  22. tree.pack(side=LEFT, fill=BOTH, expand=True)
  23. vsb.pack(fill=Y, side=RIGHT)

  24. appForm.mainloop()
复制代码


这种方法将长文本分割成多个段落,并使用`ttk.Treeview`来显示。这样可以提供更好的滚动体验并避免卡顿问题。希望这次能满足您的需求。如果还有任何问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-19 10:02:40 | 显示全部楼层
本帖最后由 myjcn 于 2024-5-19 10:09 编辑

找到办法了,GUI更换为wxPython问题解决了,再也不卡顿

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(500,400))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.control.SetInsertionPointEnd()
        self.control.AppendText(f_text)
        self.Show(True)

f_text = open('./Unicode_v15_HanZi_utf-16_3400-FAFF', 'r', encoding='utf-8').read()

app = wx.App(False)
frame = MyFrame(None, 'wxPython - TextCtrl控件')
app.MainLoop()

捕获3.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-19 10:02:45 | 显示全部楼层
myjcn 发表于 2024-05-19 10:02
找到办法了,GUI更换为wxPython问题解决了,再也不卡 ...


很高兴您找到了解决办法并解决了卡顿的问题!wxPython是一个非常流行的Python GUI库,它提供了许多强大和灵活的功能。通过更换为wxPython,您可以获得更好的用户体验和性能。如果在使用wxPython过程中遇到任何问题,都可以随时向我提问。祝您编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-19 16:49:57 | 显示全部楼层
在 Tkinter 中,长文本行可能会导致性能问题,如卡顿。

为了解决这个问题,可以考虑使用其他控件或方法来优化显示长文本行,而不需要换行符或分页。

给鱼油分享 3 种方式(第1、2种亲测有效)


解决方案1:使用 Canvas 控件

Canvas 控件可以更高效地处理长文本行。下面是一个示例:

  1. import tkinter as tk

  2. test = 'Text()文本框使用滚动条后超长单行卡顿问题' * 1000

  3. class App:
  4.     def __init__(self, root):
  5.         root.title('测试窗口')
  6.         root.geometry('500x400')

  7.         self.canvas = tk.Canvas(root)
  8.         self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

  9.         self.scrollbar = tk.Scrollbar(root, command=self.canvas.yview)
  10.         self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

  11.         self.canvas.configure(yscrollcommand=self.scrollbar.set)
  12.         self.canvas.bind('<Configure>', self.on_configure)

  13.         self.frame = tk.Frame(self.canvas)
  14.         self.canvas.create_window((0, 0), window=self.frame, anchor='nw')

  15.         self.label = tk.Label(self.frame, text=test)
  16.         self.label.pack()

  17.     def on_configure(self, event):
  18.         self.canvas.configure(scrollregion=self.canvas.bbox('all'))

  19. root = tk.Tk()
  20. app = App(root)
  21. root.mainloop()
复制代码



解决方案2:使用 Text 控件并分块插入

将长文本分块插入 Text 控件,可以缓解卡顿问题:

  1. import tkinter as tk

  2. test = 'Text()文本框使用滚动条后超长单行卡顿问题' * 1000

  3. def insert_text_in_chunks(text_widget, text, chunk_size=1000):
  4.     for i in range(0, len(text), chunk_size):
  5.         text_widget.insert(tk.END, text[i:i+chunk_size])
  6.         text_widget.update_idletasks()

  7. root = tk.Tk()
  8. root.title('测试窗口')
  9. root.geometry('500x400')

  10. scrollbar = tk.Scrollbar(root)
  11. scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

  12. textbox = tk.Text(root, wrap='none', yscrollcommand=scrollbar.set)
  13. textbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
  14. scrollbar.config(command=textbox.yview)

  15. insert_text_in_chunks(textbox, test)

  16. root.mainloop()
复制代码



解决方案3:使用 Text 控件并禁用自动换行

禁用 Text 控件的自动换行可以提高性能:

  1. import tkinter as tk

  2. test = 'Text()文本框使用滚动条后超长单行卡顿问题' * 1000

  3. root = tk.Tk()
  4. root.title('测试窗口')
  5. root.geometry('500x400')

  6. scrollbar = tk.Scrollbar(root)
  7. scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

  8. textbox = tk.Text(root, wrap='none', yscrollcommand=scrollbar.set)
  9. textbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
  10. scrollbar.config(command=textbox.yview)

  11. textbox.insert(tk.INSERT, test)

  12. root.mainloop()
复制代码


以上这些方法,都可以在不影响滚动条功能的情况下,更高效地处理和显示超长文本行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-19 19:56:32 | 显示全部楼层


别作死 就不会卡
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表