myjcn 发表于 2024-5-19 09:10:57

[求助] 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吗?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

myjcn 发表于 2024-5-19 09:20:09

我的意思是文本框显示效果还是按截图那样展示,而不是在一行显示。
上面回复的代码,是在一行显示,并且鼠标点击文本后按END键,窗体卡死……

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

myjcn 发表于 2024-5-19 09:24:31

还是不行,显示效果达到了,但是使用鼠标滚轮或者拖动滚动条,文本框内容刷新很慢给人卡顿的感觉

FishC 发表于 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 = 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: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()

FishC 发表于 2024-5-19 10:02:45

myjcn 发表于 2024-05-19 10:02
找到办法了,GUI更换为wxPython问题解决了,再也不卡 ...

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 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)
      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()

以上这些方法,都可以在不影响滚动条功能的情况下,更高效地处理和显示超长文本行。

歌者文明清理员 发表于 2024-5-19 19:56:32



别作死 就不会卡
页: [1]
查看完整版本: [求助] tkinter 文本框超长行卡顿,如何处理