有没有办法在 Tkinter 文本小部件上设置换行长度?
Is there a way to set a wrap length on a Tkinter Text Widget?
问题
我正在尝试用 Tkinter 制作一个文本编辑器。如果打开一个大的单行文件,它会大量滞后并停止响应。有没有办法为文本小部件设置换行长度?我有滚动条,我不想让字符在文本框的末尾换行。我希望它在一定数量的字符后换行。
这可能吗?
如果可以,我该怎么做?
我在 64 位上使用 Python 3.9.6 Windows 10.
我试过的
我试过在函数中使用 wraplength= ,但这不起作用。我也搜索过这个问题,没有找到。
代码
from tkinter import *
root = Tk()
root.title('Notpad [new file]')
root.geometry('1225x720')
txt = Text(root,width=150,height=40,wrap=NONE)
txt.place(x=0,y=0)
#Buttons here
scr = Scrollbar(root)
scr.pack(side='right',fill='y',expand=False)
txt.config(yscrollcommand=scr.set)
scr.config(command=txt.yview)
scr1 = Scrollbar(root,orient='horizontal')
scr1.pack(side='bottom',fill='x',expand=False)
txt.config(xscrollcommand=scr1.set)
scr1.config(command=txt.xview)
root.mainloop()
tkinter Text
小部件中没有 wraplength
选项。但是,您可以使用 tag_configure()
的 rmargin
选项 模拟 效果。
下面是使用 rmargin
选项的自定义文本小部件的示例:
import tkinter as tk
from tkinter import font
class MyText(tk.Text):
def __init__(self, master=None, **kw):
self.wraplength = kw.pop('wraplength', 80)
# create an instance variable of type font.Font
# it is required because Font.measure() is used later
self.font = font.Font(master, font=kw.pop('font', ('Consolas',12)))
super().__init__(master, font=self.font, **kw)
self.update_rmargin() # keep monitor and update "rmargin"
def update_rmargin(self):
# determine width of a character of current font
char_w = self.font.measure('W')
# calculate the "rmargin" in pixel
rmargin = self.winfo_width() - char_w * self.wraplength
# set up a tag with the "rmargin" option set to above value
self.tag_config('rmargin', rmargin=rmargin, rmargincolor='#eeeeee')
# apply the tag to all the content
self.tag_add('rmargin', '1.0', 'end')
# keep updating the "rmargin"
self.after(10, self.update_rmargin)
root = tk.Tk()
textbox = MyText(root, width=100, font=('Consolas',12), wrap='word', wraplength=90)
textbox.pack(fill='both', expand=1)
# load current file
with open(__file__) as f:
textbox.insert('end', f.read())
root.mainloop()
请注意,我使用了 after()
,因此即使内容发生变化,rmargin
选项也会应用于更新的内容。
另请注意,这可能不是一种有效的方法,但它显示了一种可能的方法。
问题
我正在尝试用 Tkinter 制作一个文本编辑器。如果打开一个大的单行文件,它会大量滞后并停止响应。有没有办法为文本小部件设置换行长度?我有滚动条,我不想让字符在文本框的末尾换行。我希望它在一定数量的字符后换行。
这可能吗? 如果可以,我该怎么做?
我在 64 位上使用 Python 3.9.6 Windows 10.
我试过的
我试过在函数中使用 wraplength= ,但这不起作用。我也搜索过这个问题,没有找到。
代码
from tkinter import *
root = Tk()
root.title('Notpad [new file]')
root.geometry('1225x720')
txt = Text(root,width=150,height=40,wrap=NONE)
txt.place(x=0,y=0)
#Buttons here
scr = Scrollbar(root)
scr.pack(side='right',fill='y',expand=False)
txt.config(yscrollcommand=scr.set)
scr.config(command=txt.yview)
scr1 = Scrollbar(root,orient='horizontal')
scr1.pack(side='bottom',fill='x',expand=False)
txt.config(xscrollcommand=scr1.set)
scr1.config(command=txt.xview)
root.mainloop()
tkinter Text
小部件中没有 wraplength
选项。但是,您可以使用 tag_configure()
的 rmargin
选项 模拟 效果。
下面是使用 rmargin
选项的自定义文本小部件的示例:
import tkinter as tk
from tkinter import font
class MyText(tk.Text):
def __init__(self, master=None, **kw):
self.wraplength = kw.pop('wraplength', 80)
# create an instance variable of type font.Font
# it is required because Font.measure() is used later
self.font = font.Font(master, font=kw.pop('font', ('Consolas',12)))
super().__init__(master, font=self.font, **kw)
self.update_rmargin() # keep monitor and update "rmargin"
def update_rmargin(self):
# determine width of a character of current font
char_w = self.font.measure('W')
# calculate the "rmargin" in pixel
rmargin = self.winfo_width() - char_w * self.wraplength
# set up a tag with the "rmargin" option set to above value
self.tag_config('rmargin', rmargin=rmargin, rmargincolor='#eeeeee')
# apply the tag to all the content
self.tag_add('rmargin', '1.0', 'end')
# keep updating the "rmargin"
self.after(10, self.update_rmargin)
root = tk.Tk()
textbox = MyText(root, width=100, font=('Consolas',12), wrap='word', wraplength=90)
textbox.pack(fill='both', expand=1)
# load current file
with open(__file__) as f:
textbox.insert('end', f.read())
root.mainloop()
请注意,我使用了 after()
,因此即使内容发生变化,rmargin
选项也会应用于更新的内容。
另请注意,这可能不是一种有效的方法,但它显示了一种可能的方法。