[求助] tkinter 文本框超长行卡顿,如何处理
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.6Tk version 8.6
能否不要使用换行符,或者分页,就在一行完全显示文本信息?最好是不要取消滚动条,难道真要换GUI吗?
在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 小助理,如未能正确解答您的问题,请继续追问。 我的意思是文本框显示效果还是按截图那样展示,而不是在一行显示。
上面回复的代码,是在一行显示,并且鼠标点击文本后按END键,窗体卡死……
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 小助理,如未能正确解答您的问题,请继续追问。 还是不行,显示效果达到了,但是使用鼠标滚轮或者拖动滚动条,文本框内容刷新很慢给人卡顿的感觉 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 = 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 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 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()
myjcn 发表于 2024-05-19 10:02
找到办法了,GUI更换为wxPython问题解决了,再也不卡 ...
很高兴您找到了解决办法并解决了卡顿的问题!wxPython是一个非常流行的Python GUI库,它提供了许多强大和灵活的功能。通过更换为wxPython,您可以获得更好的用户体验和性能。如果在使用wxPython过程中遇到任何问题,都可以随时向我提问。祝您编程愉快!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 在 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)
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()
以上这些方法,都可以在不影响滚动条功能的情况下,更高效地处理和显示超长文本行。 …
别作死 就不会卡
页:
[1]