我正在使用tkinter制作一个编辑器,我已经创建了一个状态栏,我有2个标签来显示实际的行和列,以及行的总行数,但标签的文本不在&# 39;改变任何事情。
我的代码在这里显示非常长。 我用这两个函数计算出行,列和行:
def get_position(self, event=None):
"""get the line and column number of the text insertion point"""
self.line = tk.StringVar()
self.column = tk.StringVar()
self.line, self.column = self.textView.index('insert').split('.')
self.s = tk.StringVar()
self.s.set(('Line : {0} - Column : {1}'.format(self.line, self.column)))
print(self.s)
return self.s
def getwindowlines(self, event=None):
self.numberoflines = int(self.textView.index('end-1c').split('.')[0])
return self.numberoflines
状态栏的功能是下一个:
def statusBar(self):
self.frameStatus = tk.Frame(self.master, border=2, bg='#272822',
relief='sunken')
self.frameStatus.pack(side='bottom', after=self.toolbar,
fill='x', padx=5, pady=1)
numberoflinestxt = str(self.getwindowlines())
self.labelNumberOfLines = tk.Label(self.frameStatus,
text='Lines: {0} '.format(numberoflinestxt))
self.labelNumberOfLines.configure(bg='#272822', fg='white')
self.labelNumberOfLines.pack(side='right', fill='x', padx=10, pady=2)
self.labelLinePosition = tk.Label(self.frameStatus,
textvariable=self.get_position())
self.labelLinePosition.configure(bg='#272822', fg='white')
self.labelLinePosition.pack(side='left', fill='x', padx=10, pady=2)
所有代码都在文件IdlePlus.py 中的Github Code Link 中 使用打印控制台一切正常,但使用标签时,行和列的数量不会改变。 感谢
答案 0 :(得分:2)
您的代码似乎没有尝试更改状态栏中的标签。我不明白为什么你认为他们应该改变。在get_position
函数中,每次调用它时都会创建新的StringVar
。
我不会在这里使用StringVar
,尽管你可以。如果要使用它们,只需创建一次并将它们与Label
窗口小部件关联,然后在需要更改标签时更改变量。如果您想使用.format(...)
,则必须在更改值时调用它,而不是在创建标签时调用。
例如:
def statusBar(self):
...
self.line = tk.StringVar()
self.column = tk.StringVar()
self.labelLinePosition = tk.Label(self.frameStatus,
textvariable=self.self.column)
self.labelLinePosition = tk.Label(self.frameStatus,
textvariable=self.column)
...
def get_position(self):
line, column = self.textView.index('insert').split('.')
self.line.set("Line: {0}".format(line))
self.column.set("Position: {0}".format(column)
每次调用get_position
时都会导致标签更新。
然而,真的不需要特殊的StringVar
。您可以直接设置标签的文本,从而消除了几个对象,从而略微降低了代码的复杂性:
def statusbar(self):
...
self.labelNumberOfLines = tk.Label(self.frameStatus)
self.labelLinePosition = tk.Label(self.frameStatus)
...
def get_position(self):
line, column = self.textView.index('insert').split('.')
self.labelNumberOfLines.configure(text="Lines: {0}".format(lines))
self.labelLinePosition.configure(text="Character: {0}".format(column))