2016-04-22 17 views
1

"remove rect"ボタンをクリックしてキャンバス上のランダムなシェイプを削除しようとしました。私の方法はうまくいかないようです。私はこのエラーが発生し続ける、小さくなければならないが、私はそれを見つけることができない。あなたがコレクションに作成された矩形を追跡する必要がキャンバス上のdeleteメソッド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() 

答えて

0

。長方形を削除するには、コレクションから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

whats tkinter import * importランダム root = Tk()とtkinterをtk importとしてインポートします。ランダムルート= tk.Tk()whats tk.Tk() –

+0

'tk.Tk()'が作成を呼び出しています'tk'モジュールの' Tk'オブジェクトの 'tkinter *'をインポートしました。私は 'tkinter as tk'をインポートしました。これは名前空間をきれいに保ちます。 'tkinter import *'から 'tkinter'のすべてのメソッドとクラスがあなたの名前空間に入ります。 tkinterをインポートするときには、tkinterメソッドとクラスの呼び出しに 'tk 'を付ける必要があります。 –

関連する問題