在画布 tkinter 上删除方法 [英] delete method on canvas tkinter

查看:58
本文介绍了在画布 tkinter 上删除方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试通过单击创建的删除矩形"按钮删除画布上的随机形状.但我的方法似乎不起作用.我一直收到这个错误,一定很小,但我似乎找不到它.

Trying to delete a random shape on canvas by clicking the "remove rect" button created. but my method doesn't seem to work. I keep getting this error, must be small but I can't seem to find it.

TypeError: removeRects() 缺少 1 个必需的位置参数:'canvas'

TypeError: removeRects() missing 1 required positional argument: 'canvas'

from tkinter import *
import random
root = Tk()


class Recta:
    def __init__(self, height=60, width=80):
        self.height = height
        self.width = width
        self.create_buttons()
        self.canvas = Canvas(root)
        self.canvas.pack()

    def removeRects(self,canvas):
        my_rect = self.canvas.create_rectangle(0,0,w,h,fill = "green")
        self.canvas.delete(my_rect)

    def create_buttons(self):
        self.frame = Frame(root, bg='grey', width=400, height=40)
        self.frame.pack(fill='x')
        self.button1 = Button(self.frame, text='Rect', command=self.randomRects)
        self.button1.pack(side='left', padx=10)
        self.button2 = Button(self.frame, text='Remove Rect', command=self.removeRects)
        self.button2.pack(side='left')

    def randomRects(self):
        w = random.randrange(300)
        h = random.randrange(200)
        self.canvas.create_rectangle(0, 0, w, h, fill= "green")


tes = Recta()
root.mainloop()

推荐答案

您必须跟踪您在集合中创建的矩形;然后从集合中提取 id 以删除一个矩形.

You have to keep track of the rectangles you are creating in a collection; then extract the id from the collection in order to remove a rectangle.

在这里,我创建了一个列表来聚合创建的矩形的 id:self.canvas.create_rectangle(0, 0, w, h, fill='green') 返回一个 id 编号,该编号存储在集合中.

here, I created a list to aggregate the ids of the rectangle created: self.canvas.create_rectangle(0, 0, w, h, fill='green') returns an id number that is stored in the collection.

调用 delete 方法后,会检索(并从集合中删除)最后创建的矩形中的 id 并用于 removecanvas 中的矩形.

Upon calling the delete method, the id from the last created rectangle is retrieved (and removed from the collection) and used to remove the rectangle from the canvas.

import tkinter as tk
import random
root = tk.Tk()

class Recta:

    def __init__(self, height=60, width=80):
        self.height = height
        self.width = width
        self.create_buttons()
        self.canvas = tk.Canvas(root)
        self.canvas.pack()
        self.rects = []

    def create_buttons(self):
        self.frame = tk.Frame(root, bg='grey', width=400, height=40)
        self.frame.pack(fill='x')

        self.button1 = tk.Button(self.frame, text='Add Rect', command=self.randomRects)
        self.button1.pack(side='left', padx=10)
        self.button2 = tk.Button(self.frame, text='Remove Rect', command=self.removeRects)
        self.button2.pack(side='left')

    def removeRects(self):
        if len(self.rects) > 0:
            self.canvas.delete(self.rects.pop())

    def randomRects(self):
        w = random.randrange(300)
        h = random.randrange(200)
        self.rects.append(self.canvas.create_rectangle(0, 0, w, h, fill='green'))


tes = Recta()
root.mainloop()

这是带有 * 导入的相同代码!

Here is the same code with a * import!

from tkinter import *
import random
root = Tk()

class Recta:

    def __init__(self, height=60, width=80):
        self.height = height
        self.width = width
        self.create_buttons()
        self.canvas = Canvas(root)
        self.canvas.pack()
        self.rects = []

    def create_buttons(self):
        self.frame = Frame(root, bg='grey', width=400, height=40)
        self.frame.pack(fill='x')

        self.button1 = Button(self.frame, text='Add Rect', command=self.randomRects)
        self.button1.pack(side='left', padx=10)
        self.button2 = Button(self.frame, text='Remove Rect', command=self.removeRects)
        self.button2.pack(side='left')

    def removeRects(self):
        if len(self.rects) > 0:
            self.canvas.delete(self.rects.pop())

    def randomRects(self):
        w = random.randrange(300)
        h = random.randrange(200)
        self.rects.append(self.canvas.create_rectangle(0, 0, w, h, fill='green'))


tes = Recta()
root.mainloop()

这篇关于在画布 tkinter 上删除方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆