tkinter.text有自动换行机制,有什么办法可以让换行并缩进某个单位

问题描述 投票:0回答:1

在此输入图像描述 我希望包裹部分的未着色部分缩进并对齐,因为每个字符大小不固定,我无法通过计算字符数来做到这一点,我需要重写tk中的which方法。

以下是当前相关代码,效果如图。

class re_Text():
    def __init__(self, queue):
        self.queue = queue

    def write(self, content):
        self.queue.append(content)

    def flush(self):
        pass


class GUI():
    def __init__(self, root):
        self.msg_queue = deque()
        self.initGUI(root)

    def show_msg(self):
        save_queue = self.msg_queue
        while self.msg_queue:
            content = self.msg_queue.popleft()
            self.text.config(state=NORMAL)
            self.text.insert(tk.END, content)
            c_t = re.findall(r'^\[\d{2}:\d{2}:\d{2}]', content)
            if c_t: self.apply_tag('c', c_t[0])
            self.text.config(state=DISABLED)
        self.msg_queue = save_queue
        self.text.see(END)
        self.root.after(50, self.show_msg)

    def initGUI(self, root):
        self.root = root

        self.scrollBar = tk.Scrollbar(self.root)

        self.text = tk.Text(self.root, yscrollcommand=self.scrollBar.set, state=DISABLED, relief='flat', font=my_font_llt_8, fg='black', bg='#fcfcfc')
        self.text.place(x=390, y=10, width=175, height=365)
        self.scrollBar.config(command=self.text.yview)

        self.text.bind('<1>', lambda e: 'break')
        self.text.bind('<B1-Motion>', lambda e: 'break')
        self.text.bind('<Shift-1>', lambda e: 'break')

        self.text.tag_configure('c', foreground='#ff7f7f')

        self.root.after(50, self.show_msg)

    def delLastText(self):
        self.msg_queue.pop()
        self.msg_queue.pop()

    def apply_tag(self, tag_name, search_string, replacement_string=None):
        start_pos = '1.0'
        while True:
            start_pos = self.text.search(search_string, start_pos, stopindex=tk.END)
            if not start_pos:
                break
            end_pos = self.text.index(start_pos + '+%dc' % len(search_string))
            if replacement_string:
                self.text.delete(start_pos, end_pos)
                self.text.insert(start_pos, replacement_string)
            self.text.tag_add(tag_name, start_pos, end_pos)
            start_pos = end_pos
python tkinter tkinter-text
1个回答
0
投票

有一个 tag 选项

lmargin2
,它定义换行行(不包括第一行)的左侧缩进(边距)(以像素为单位):

self.text.tag_config('wrap-indent', lmargin2=78) # change 78 to whatever value you want

然后就可以在插入消息时指定标签了:

msg = '''\
[17:24:22] 程序初始化完成
[17:24:32] 信息已錄入
[17:24:32] 文件路徑: D:\\Desktop\\Desktop\\image\\128g.gif
[17:23:32] 已經分離出需處理的幀47幀
'''
self.text.insert('end', msg, 'wrap-indent')

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.