无法删除画布上的 tkinter 对象 [英] Cannot delete tkinter object on canvas
问题描述
我创建了一个类对象 Dot()
,一个函数 update()
更新其位置,然后在 canvas上生成它的许多实例代码>,将它们添加到列表中.我运行了一个不断更新点位置的循环,这工作正常,但我还想在每次循环运行时删除
Dot()
的一个实例.
我尝试了很多方法,但都没有成功.通过使用 canvas.delete()
函数,我只冻结"了实例化,但它保留在屏幕上.我该如何解决这个问题?
将 numpy 导入为 np随机导入导入时间从 tkinter 导入 *#创建画布#屏幕 = Tk()嘿 = 600宽度 = 600画布 = 画布(屏幕,宽度=宽度,高度=黑)画布.pack()颜色 = [红色",绿色",蓝色"]类点:def __init__(self):self.l = random.randrange(100,200)self.t = random.randrange(100,200)self.l2= self.l-10self.t2 = self.t-10颜色 = random.choice(colors)self.shape = canvas.create_oval(self.l, self.t, self.l2, self.t2, fill=color)self.speedx = random.randrange(1,3)self.speedy = random.randrange(1,3)定义更新(自我):canvas.move(self.shape, self.speedx, self.speedy)pos = canvas.coords(self.shape)抖动 = random.randrange(0,200)如果 pos[2] >= wid+jitter 或 pos[0] <= -jitter:self.speedx *= -1如果 pos[3] >= hei+jitter 或 pos[1] <= -jitter:self.speedy *= -1点 = []对于我在范围内(100):dots.append(Dot())为真:删除点[-1]canvas.delete(点[-1])对于点中点:点.更新()屏幕更新()时间.睡眠(0.005)screen.mainloop()
delete
方法采用画布项的标识符,而不是画布项本身.>
此外,您可能应该在超时函数中进行删除,否则 GUI 将无法正常运行.
试试这个代码:
随机导入从 tkinter 导入 *屏幕 = Tk()嘿 = 600宽度 = 600画布 = 画布(屏幕,宽度=宽度,高度=黑)画布.pack()颜色 = [红色",绿色",蓝色"]类点:def __init__(self):self.l = random.randrange(100, 200)self.t = random.randrange(100, 200)self.l2 = self.l-10self.t2 = self.t-10颜色 = random.choice(colors)self.shape = canvas.create_oval(self.l, self.t, self.l2, self.t2, fill=color)self.speedx = random.randrange(1, 3)self.speedy = random.randrange(1, 3)定义更新(自我):canvas.move(self.shape, self.speedx, self.speedy)pos = canvas.coords(self.shape)抖动 = random.randrange(0, 200)如果 pos[2] >= wid+jitter 或 pos[0] <= -jitter:self.speedx *= -1如果 pos[3] >= hei+jitter 或 pos[1] <= -jitter:self.speedy *= -1点 = []对于我在范围内(100):dots.append(Dot())定义超时():如果点:canvas.delete(dots[-1].shape)删除点[-1]对于点中点:点.更新()screen.after(5, 超时)screen.after(5, 超时)screen.mainloop()
(使用 Python 3 测试)
I have created a class object Dot()
, a function update()
that updates its position and then generated many instances of it on canvas
, adding them to a list. I run a loop that keeps updating the position of the dots, and this works fine, but I also want to delete one instantiation of Dot()
at each run of the loop.
I've tried many ways but with no success. By using canvas.delete()
function I only "freeze" the instantiation, but it remains on screen. How can I fix this?
import numpy as np
import random
import time
from tkinter import *
#create Canvas#
screen = Tk()
hei = 600
wid = 600
canvas = Canvas(screen,width=wid,height=hei)
canvas.pack()
colors = ["red", "green", "blue"]
class Dot:
def __init__(self):
self.l = random.randrange(100,200)
self.t = random.randrange(100,200)
self.l2= self.l-10
self.t2 = self.t-10
color = random.choice(colors)
self.shape = canvas.create_oval(self.l, self.t, self.l2, self.t2, fill=color)
self.speedx = random.randrange(1,3)
self.speedy = random.randrange(1,3)
def update(self):
canvas.move(self.shape, self.speedx, self.speedy)
pos = canvas.coords(self.shape)
jitter = random.randrange(0,200)
if pos[2] >= wid+jitter or pos[0] <= -jitter:
self.speedx *= -1
if pos[3] >= hei+jitter or pos[1] <= -jitter:
self.speedy *= -1
dots = []
for i in range(100):
dots.append(Dot())
while True:
del dots[-1]
canvas.delete(dots[-1])
for dot in dots:
dot.update()
screen.update()
time.sleep(0.005)
screen.mainloop()
The delete
method takes the identifier of a canvas item, not the canvas item itself.
Additionally, you should probably do the deletion in a timeout function, otherwise, the GUI won't function properly.
Try this code:
import random
from tkinter import *
screen = Tk()
hei = 600
wid = 600
canvas = Canvas(screen, width=wid, height=hei)
canvas.pack()
colors = ["red", "green", "blue"]
class Dot:
def __init__(self):
self.l = random.randrange(100, 200)
self.t = random.randrange(100, 200)
self.l2 = self.l-10
self.t2 = self.t-10
color = random.choice(colors)
self.shape = canvas.create_oval(self.l, self.t, self.l2, self.t2, fill=color)
self.speedx = random.randrange(1, 3)
self.speedy = random.randrange(1, 3)
def update(self):
canvas.move(self.shape, self.speedx, self.speedy)
pos = canvas.coords(self.shape)
jitter = random.randrange(0, 200)
if pos[2] >= wid+jitter or pos[0] <= -jitter:
self.speedx *= -1
if pos[3] >= hei+jitter or pos[1] <= -jitter:
self.speedy *= -1
dots = []
for i in range(100):
dots.append(Dot())
def timeout():
if dots:
canvas.delete(dots[-1].shape)
del dots[-1]
for dot in dots:
dot.update()
screen.after(5, timeout)
screen.after(5, timeout)
screen.mainloop()
(Tested with Python 3)
这篇关于无法删除画布上的 tkinter 对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!