tkinter标签中的不可变更改文本

时间:2014-11-15 10:18:55

标签: python-3.x tkinter

我正在使用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 使用打印控制台一切正常,但使用标签时,行和列的数量不会改变。 感谢

1 个答案:

答案 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))