python tkinter Text里面实现显示行号
时间: 2023-11-13 11:05:58 浏览: 150
可以通过在 Text 组件左侧插入一个 LineNumber 类型的 Text 组件来实现显示行号。
以下是示例代码:
```python
import tkinter as tk
class LineNumber(tk.Text):
def __init__(self, *args, **kwargs):
tk.Text.__init__(self, *args, **kwargs)
self.config(state="disabled", padx=4)
def update(self, first, last):
self.config(state="normal")
self.delete(1.0, "end")
for i in range(first, last):
self.insert("end", f"{i}\n")
self.config(state="disabled")
class MainApplication(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
self.text_widget = tk.Text(self, padx=4)
self.text_widget.pack(side="right", fill="both", expand=True)
self.text_widget.bind("<Key>", self.update_line_numbers)
self.linenumbers = LineNumber(self, width=4)
self.linenumbers.pack(side="left", fill="y")
self.scrollbar = tk.Scrollbar(self.text_widget)
self.scrollbar.pack(side="right", fill="y")
self.text_widget.config(yscrollcommand=self.scrollbar.set)
self.scrollbar.config(command=self.text_widget.yview)
self.update_line_numbers()
def update_line_numbers(self, event=None):
first, last = self.text_widget.yview()
first = int(first * self.text_widget.index("end-1c").split(".")[0])
last = int(last * self.text_widget.index("end-1c").split(".")[0])
self.linenumbers.update(first, last)
if __name__ == "__main__":
root = tk.Tk()
app = MainApplication(root)
app.pack(side="top", fill="both", expand=True)
root.mainloop()
```
在这个示例中,我们创建了一个名为 LineNumber 的类,它继承自 Text 类,并且添加了一个 update 方法,用于更新行号。
在 MainApplication 类中,我们创建了一个 Text 组件和一个 LineNumber 组件,并将它们都放置在一个 Frame 中。我们还创建了一个 Scrollbar 组件,并将其与 Text 组件关联起来。在 update_line_numbers 方法中,我们获取当前 Text 组件的可视区域(即首行和尾行),然后调用 LineNumber 的 update 方法来更新行号。
在主函数中,我们创建了一个 Tkinter 窗口,并将 MainApplication 放置在其中,然后启动主循环。
阅读全文