如何从Tkinter上的Text小部件中清除文本?

时间:2017-09-07 17:32:04

标签: python tkinter

所以我在Tkinter上创建了一个状态栏,我希望在那里显示一些值。有时该值会发生变化,因此我需要将状态栏更改为。当我运行我的程序时,值显示正常,但是当我更改值并插入它时,旧值保持不变,新值将打印在旧值旁边。

我的问题是如何先删除第一个然后添加另一个?

from tkinter import *
class lol:

   def __init__(self, window):
       frame = Frame(window)
       frame.grid()

       self.statusbarTotal = Text(window, width= 8, height= 1, bd=1, relief= SUNKEN)
       self.statusbarTotal.grid(row=13, column=0, sticky=W)

       self.presetButton1 = Button(window, text=" 10 ", command=self.preset10)
       self.presetButton1.grid(row=2, column=0)

       self.presetButton2 = Button(window, text=" 30 ", command=self.preset30)
       self.presetButton2.grid(row=2, column=1)


   def preset10(self):
          global waitingTime
          waitingTime = 600
          self.statusbarTotal.insert(13.0, int(waitingTime/60))
          print(waitingTime)

   def preset30(self):
          global waitingTime
          waitingTime = 1800
          self.statusbarTotal.insert(13.0, int(waitingTime/60))
          print(waitingTime)

tk = Tk()
b = lol(tk)
tk.mainloop()

2 个答案:

答案 0 :(得分:1)

除了你的缩进问题。 你需要改变:

def preset10(self):
    global waitingTime
    waitingTime = 600
    self.statusbarTotal.insert(13.0, int(waitingTime/60))
    print(waitingTime)

def preset30(self):
    global waitingTime
    waitingTime = 1800
    self.statusbarTotal.insert(13.0, int(waitingTime/60))
    print(waitingTime)

要:

def preset10(self):
    global waitingTime
    waitingTime = 600
    self.statusbarTotal.delete(1.0, END)
    self.statusbarTotal.insert(13.0, int(waitingTime/60))
    print(waitingTime)

def preset30(self):
    global waitingTime
    waitingTime = 1800
    self.statusbarTotal.delete(1.0, END)
    self.statusbarTotal.insert(13.0, int(waitingTime/60))
    print(waitingTime)

但是你的程序在一行显示所有数据,所以我不确定你为什么要在文本框的第13行插入值。如果你能提供背景或更好的例子,我可以提供更好的答案。

但是你应该真正摆脱你的global变量,因为这被认为是不好的编程使用。

相反,您的代码应该使用类属性。像这样:

from tkinter import *


class lol:

    def __init__(self, window):
        frame = Frame(window)
        frame.grid()
        # uss self. to make a variable name a class attribute
        self.waitingTime = 0

        self.statusbarTotal = Text(window, width= 8, height= 1, bd=1, relief= SUNKEN)
        self.statusbarTotal.grid(row=13, column=0, sticky=W)

        self.presetButton1 = Button(window, text=" 10 ", command=self.preset10)
        self.presetButton1.grid(row=2, column=0)

        self.presetButton2 = Button(window, text=" 30 ", command=self.preset30)
        self.presetButton2.grid(row=2, column=1)


    def preset10(self):
        self.waitingTime = 600
        self.statusbarTotal.delete(1.0, END)
        self.statusbarTotal.insert(13.0, int(self.waitingTime/60))
        print(self.waitingTime)

    def preset30(self):
        self.waitingTime = 1800
        self.statusbarTotal.delete(1.0, END)
        self.statusbarTotal.insert(13.0, int(self.waitingTime/60))
        print(self.waitingTime)

tk = Tk()
b = lol(tk)
tk.mainloop()

答案 1 :(得分:0)

几种可能性。

首先,insert 将新文本插入现有文本中。因此,您必须使用delete删除您不再需要的部分。

我认为另一个更简单的解决方案是不使用Text小部件,而是使用Label,它允许您设置和替换它显示的text一次全部。您无法手动编辑Label小部件中的文本,但我认为状态栏不是您想要的。