2017-02-22 18 views
1

私はこれまでこのコードを持っています。最初はよく働いたサークルを描きました。私は描画矩形は簡単だと思いましたが、私は四角形を描画することしかできませんでした。私は様々な幅と長さの形を持つことを望んでいました。私は(x1、y1、x2、y2)のボックスを変更する必要があることを知っていますか?Tkinterを使って矩形を描く?

def down(event): # A mouse event will be passed in with x and y attributes 
global startx, starty # Use global variables for assignment 
startx = event.x # Store the mouse down coordinates in the global variables 
starty = event.y 

def up(event): 
    tk_color_string = color(red_intvar, green_intvar, blue_intvar) 
    r = (startx-event.x)**2 + (starty-event.y)**2 # Pythagorean theorem 
    r = int(r**.5)         # square root to get distance 
    new_shape = canvas.create_rectangle(startx-r, starty-r, startx+r, starty+r, 
            fill=tk_color_string, outline='#000000') 
    shapes.append(new_shape) # aggregate the canvas' item 

コード全体が100行を超えていますので、この部分が私に求めていることを示すのに役立ちます。 enter image description here

+0

あなたが何を求めているのか分かりません。あなたがしなければならないことは、四角形の1つのコーナーのx座標またはy座標に少し余分に追加するだけで、四角形を描くことがわかりますか? –

+0

イメージを挿入しようとしましたが、私も許可されません。私はさまざまな形や大きさでそれらを描くことができるようにしたい。私が何をしても四角形として描きます。私が使用しているコードは私が作成したものではありませんでした。私はちょうどそれがサークルではなく四角形を使用するように修正していました。 – Kkheartsmak

+0

長方形や画像についてご質問ですか?スクエアの一角の座標を変更しようとしましたか? –

答えて

1

私はちょうどマウスでtkinterキャンバスに四角形を作成する方法を書いたサンプルコードを提供しています。これにより、必要な手順と方法を理解するのに役立ちます。その後、あなたの特定の問題に適応させてください。これがあなたのお手伝いをしてくれることを願っています。

例コード:ユーザーがマウスで矩形オブジェクトを描画できるtkinterキャンバスを作成する方法。

import tkinter as tk 

class App(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self._createVariables(parent) 
     self._createCanvas() 
     self._createCanvasBinding() 

    def _createVariables(self, parent): 
     self.parent = parent 
     self.rectx0 = 0 
     self.recty0 = 0 
     self.rectx1 = 0 
     self.recty1 = 0 
     self.rectid = None 
     self.move = False 

    def _createCanvas(self): 
     self.canvas = tk.Canvas(self.parent, width = 800, height = 400, 
           bg = "white") 
     self.canvas.grid(row=0, column=0, sticky='nsew') 

    def _createCanvasBinding(self): 
     self.canvas.bind("<Button-1>", self.startRect) 
     self.canvas.bind("<ButtonRelease-1>", self.stopRect) 
     self.canvas.bind("<Motion>", self.movingRect) 

    def startRect(self, event): 
     self.move = True 
     #Translate mouse screen x0,y0 coordinates to canvas coordinates 
     self.rectx0 = self.canvas.canvasx(event.x) 
     self.recty0 = self.canvas.canvasy(event.y) 
     #Create rectangle 
     self.rect = self.canvas.create_rectangle(
      self.rectx0, self.recty0, self.rectx0, self.recty0, fill="#4eccde") 
     #Get rectangle's canvas object ID 
     self.rectid = self.canvas.find_closest(self.rectx0, self.recty0, halo=2) 
     print('Rectangle {0} started at {1} {2} {3} {4} '. 
       format(self.rect, self.rectx0, self.recty0, self.rectx0, 
        self.recty0)) 

    def movingRect(self, event): 
     if self.move: 
      #Translate mouse screen x1,y1 coordinates to canvas coordinates 
      self.rectx1 = self.canvas.canvasx(event.x) 
      self.recty1 = self.canvas.canvasy(event.y) 
      #Modify rectangle x1, y1 coordinates 
      self.canvas.coords(self.rectid, self.rectx0, self.recty0, 
          self.rectx1, self.recty1) 
      print('Rectangle x1, y1 = ', self.rectx1, self.recty1) 

    def stopRect(self, event): 
     self.move = False 
     #Translate mouse screen x1,y1 coordinates to canvas coordinates 
     self.rectx1 = self.canvas.canvasx(event.x) 
     self.recty1 = self.canvas.canvasy(event.y) 
     #Modify rectangle x1, y1 coordinates (final) 
     self.canvas.coords(self.rectid, self.rectx0, self.recty0, 
         self.rectx1, self.recty1) 
     print('Rectangle ended') 


if __name__ == "__main__": 
    root = tk.Tk() 
    root.geometry("600x400") 
    app = App(root) 
    root.mainloop() 

使用するステップと方法の概要:

  1. tk.Canvas()方法tk.Canvasウィジェットへのコールバックと
  2. バインドマウスイベント<Button-1><ButtonRelease-1><Motion>を使用してTk()ウィンドウ内のキャンバスウィジェットを作成します。
  3. これらのイベントのそれぞれについて:
    3.1マウスステータス変数、つまりself.moveを更新またはチェックします。
    3.2変換マウスポインタ画面x、yはキャンバスに座標の方法.canvasx(event.x).canvasy(event.y)変数self.rectx0self.recty0self.rectx1self.recty1におけるこれらの変換corrdinatesを保存を使用して調整します。 event.xおよびevent.yは、マウスポインタの画面座標を提供します。
    3.3キャンバスメソッド.create_rectangle(x0, y0, x1, y1, option, ...)を使用して矩形を作成するか、キャンバスメソッド.coords(tagOrId, x0, y0, x1, y1)を使用して矩形座標を変更します。ここで、x0,y0,x1,y1は、矩形オブジェクトの左上角および右下角x & yキャンバス座標を示し、tagOrIdを矩形オブジェクトIDとする。
    3.4 <Button-1>の場合のみ、作成した矩形オブジェクトのIDを変数に格納する必要があります。この変数は、<Motion><ButtonRelease-1>の間に.coords() methodが呼び出されるたびにtagOrIdに値を提供します。