鱼C论坛

 找回密码
 立即注册
查看: 388|回复: 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

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

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

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

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

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

appForm.mainloop()

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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


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

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

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

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

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

appForm.mainloop()

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-19 09:24:31 | 显示全部楼层
还是不行,显示效果达到了,但是使用鼠标滚轮或者拖动滚动条,文本框内容刷新很慢给人卡顿的感觉
想知道小甲鱼最近在做啥?请访问 -> 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`来展示长文本,并且滚动体验较为流畅:
from tkinter import *
from tkinter import scrolledtext, ttk

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

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

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

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

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

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

appForm.mainloop()

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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


解决方案1:使用 Canvas 控件

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

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

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

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

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

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

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

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

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

root = tk.Tk()
app = App(root)
root.mainloop()


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

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

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

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

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

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

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

insert_text_in_chunks(textbox, test)

root.mainloop()


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

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

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

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

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

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

textbox.insert(tk.INSERT, test)

root.mainloop()

以上这些方法,都可以在不影响滚动条功能的情况下,更高效地处理和显示超长文本行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


别作死 就不会卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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