【问题标题】:delete method on canvas tkinter画布tkinter上的删除方法
【发布时间】:2016-04-22 05:59:44
【问题描述】:

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

TypeError: removeRects() 缺少 1 个必需的位置参数:'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()

【问题讨论】:

    标签: python python-3.x tkinter tkinter-canvas


    【解决方案1】:

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

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

    在调用delete 方法时,从最后创建的矩形中检索id(并从集合中删除)并用于remove 来自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()
    

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

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

    【讨论】:

    • import tkinter as tk import random root = tk.Tk() whats tk.Tk() ??
    • from tkinter import * import random root = Tk() 和 import tkinter as tk import random root = tk.Tk() whats tk.Tk() 有什么区别
    • tk.Tk() 正在调用在tk 模块中创建Tk 对象-您导入了tkinter *;我导入了tkinter as tk,它使命名空间保持整洁。当你from tkinter import *tkinter 的所有方法和类进入你的命名空间。当我import tkniter as tk 时,我必须在对tkinter 方法和类的调用前加上tk.
    • 在使用 tkinter 时你还能做这个方法吗*
    • 是的,您可以 - 使用您的导入方法,并删除所有 tk.prefixes 将起作用;但是,这不是推荐的方式。
    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多