【发布时间】:2014-07-22 19:59:29
【问题描述】:
我正在编写自己的代码编辑器,我希望它在左侧有编号的行。基于this answer我写了这个示例代码:
#!/usr/bin/env python3
import tkinter
class CodeEditor(tkinter.Frame):
def __init__(self, root):
tkinter.Frame.__init__(self, root)
# Line numbers widget
self.__line_numbers_canvas = tkinter.Canvas(self, width=40, bg='#555555', highlightbackground='#555555', highlightthickness=0)
self.__line_numbers_canvas.pack(side=tkinter.LEFT, fill=tkinter.Y)
self.__text = tkinter.Text(self)
self.__text['insertbackground'] = '#ffffff'
self.__text.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True)
def __update_line_numbers(self):
self.__line_numbers_canvas.delete("all")
i = self.__text.index('@0,0')
self.__text.update() #FIX: adding line
while True:
dline = self.__text.dlineinfo(i)
if dline:
y = dline[1]
linenum = i[0]
self.__line_numbers_canvas.create_text(1, y, anchor="nw", text=linenum, fill='#ffffff')
i = self.__text.index('{0}+1line'.format(i)) #FIX
else:
break
def load_from_file(self, path):
self.__text.delete('1.0', tkinter.END)
f = open(path, 'r')
self.__text.insert('0.0', f.read())
f.close()
self.__update_line_numbers()
class Application(tkinter.Tk):
def __init__(self):
tkinter.Tk.__init__(self)
code_editor = CodeEditor(self)
code_editor.pack(fill=tkinter.BOTH, expand=True)
code_editor.load_from_file(__file__)
def run(self):
self.mainloop()
if __name__ == '__main__':
app = Application()
app.run()
不幸的是,__update_line_numbers 内部出现了问题。此方法应在我的Canvas 小部件上从上到下写入行号,但它仅打印第一行的编号 (1),然后退出。为什么?
【问题讨论】:
-
所有行都有文字吗?
-
@furas 是的,这个例子已经可以运行了,它会加载他自己的源代码。
-
@BPS:嗯,是的,但是源代码的第 2 行是空的;如果您删除该空白行,它现在是对前 2 行编号然后停止,还是仍然只是第一行?
-
从文本中删除空行不会改变任何事情。
-
好的,还有两件事要测试:如果你
print(self.__text.dump(previndex, i))(显然你需要在更改之前添加previndex=i,并在循环之前将其设置为某个值),你得到第2行有什么吗?只是dlineindex('2.0')返回None还是一个值?