删除画布上的方法tkinter

问题描述:

尝试通过单击创建的“删除矩形”按钮删除画布上的随机形状。但我的方法似乎没有工作。我一直得到这个错误,一定很小,但我似乎无法找到它。删除画布上的方法tkinter

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以删除矩形。

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

一旦调用delete方法,从最后创建的矩形id被检索(并且从集合中删除),并用于removecanvas的矩形。

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() 

以下是带* 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() 
+0

进口Tkinter的称为TK 随机导入根 = tk.Tk()什么tk.Tk()? –

+0

从tkinter进口* 进口随机差异 root = Tk()和进口tkinter作为tk进口随机root = tk.Tk()whats tk.Tk() –

+0

'tk.Tk()'正在调用创建'tk'模块中的'Tk'对象 - 您导入了'tkinter *';我导入了'tkinter tk',它保持了命名空间的整洁。你从tkinter import *'中,'tkinter'的所有方法和类都进入你的命名空间。当我将'tkniter导入为tk'时,我必须给tkinter'前缀调用方法和'tk.'类。 –