【问题标题】:Python Overwriting text in TkinterPython 在 Tkinter 中覆盖文本
【发布时间】:2013-07-10 11:34:39
【问题描述】:

我在更新打印在画布上的倒数计时器文本时遇到了一些问题。我当前的代码留下了文本应该为空白的区域。

我试过把它放在不同的地方,但它们都没有效果或与我上面描述的效果相同。删除canvas.delete 函数只会导致新时间被写在旧时间之上。

这是我当前的代码:

def cdtimerr():
    global cdtimer
    cdtimer -= 1
    cdtext = canvas.create_text(510, 6, text=cdtimer, font="Ubuntu 29 bold", anchor = NW) 
    if cdtimer == 0 :
        canvas.delete(ALL)
        scorescreen()
    else:
        canvas.after(1000, cdtimerr)
        canvas.after(1000, canvas.delete(cdtext))

另外,如果我按下画布上的退出按钮加载另一个屏幕,我将如何过早终止计时器?目前,如果我加载另一个屏幕,计时器仍会继续。

【问题讨论】:

  • 您的代码示例中的缩进搞砸了。所有这些代码都是cdtimer 的一部分,还是其中一些在全局范围内?
  • 我认为它在我将它复制到我的问题后搞砸了,因为它缩进正确并且在 pydev 中工作。虽然现在修复它,但之前没有注意到它。

标签: python tkinter overwrite tkinter-canvas


【解决方案1】:

取消定时器。保存after的返回值,用保存的值调用after_cancel

from Tkinter import *

remain = 11
_timer = None
def cdtimerr():
    global remain, _timer
    remain -= 1
    cdtext = canvas.create_text(510, 6, text=remain, font="Ubuntu 29 bold", anchor=NW) 
    if remain == 0:
        canvas.delete(ALL)
    else:
        _timer = canvas.after(1000, lambda: (canvas.delete(cdtext), cdtimerr()))

root = Tk()
root.geometry('1024x768')
canvas = Canvas(root)
canvas.pack(expand=1, fill=BOTH)
_timer = canvas.after(0, cdtimerr)
Button(root, text='Cancel', command=lambda: canvas.after_cancel(_timer)).pack()
root.mainloop()

【讨论】:

  • 感谢您的回答,能够让它在程序中完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2015-01-29
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多