【问题标题】:Drawing a rectangle using Tkinter?使用 Tkinter 绘制一个矩形?
【发布时间】:2017-02-22 02:56:11
【问题描述】:

到目前为止,我有这个代码。起初我让它画出效果很好的圆圈。我以为画矩形会很容易,但我只能画正方形。我希望有各种宽度和长度的形状。我知道我需要更改 (x1, y1, x2, y2) 的框,但我该怎么做。

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

【问题讨论】:

  • 很难理解你在问什么。您是否意识到要绘制一个矩形,您所要做的就是在正方形一个角的 x 或 y 坐标上添加一点额外的东西?
  • 我尝试插入图像,但它也不允许我。我希望能够以不同的形状和大小绘制它们。无论我做什么,他们都画成正方形。我使用的代码不是我自己创建的,我只是将其修改为使用矩形而不是圆形。
  • 您的问题是关于矩形还是关于图像?你试过改变正方形一个角的坐标吗?

标签: python tkinter tkinter-canvas


【解决方案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

    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( "<B1-Motion>", self.movingRect )

    def startRect(self, event):
        #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.rectid = self.canvas.create_rectangle(
            self.rectx0, self.recty0, self.rectx0, self.recty0, fill="#4eccde")
        print('Rectangle {0} started at {1} {2} {3} {4} '.
              format(self.rectid, self.rectx0, self.recty0, self.rectx0,
                     self.recty0))

    def movingRect(self, event):
        #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):
        #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 ended')


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

使用的步骤和方法概述:

  1. 使用tk.Canvas() 方法在Tk() 窗口中创建一个画布小部件
  2. 将鼠标事件&lt;Button-1&gt;&lt;ButtonRelease-1&gt;&lt;B1-Motion&gt; 及其回调绑定到tk.Canvas 小部件。
  3. 对于这些事件中的每一个:
    3.1 使用方法.canvasx(event.x).canvasy(event.y)将鼠标指针屏幕x、y坐标转换为画布坐标,并将这些转换后的坐标存储在变量self.rectx0self.recty0self.rectx1self.recty1中。 event.xevent.y 提供鼠标指针屏幕坐标。
    3.2 使用canvas方法.create_rectangle(x0, y0, x1, y1, option, ...)创建矩形或使用canvas方法.coords(tagOrId, x0, y0, x1, y1)修改矩形坐标。这里,x0y0x1y1 表示矩形对象的左上角和右下角 x & y 画布坐标,tagOrId 表示矩形对象 ID。
    3.3 仅限&lt;Button-1&gt;,需要将创建的矩形对象的ID存储在一个变量中。每当在 &lt;B1-Motion&gt;&lt;ButtonRelease-1&gt; 期间调用 .coords() method 时,此变量都会为 tagOrId 提供值。

【讨论】:

  • 有没有办法强制用户创建正方形而不是矩形,比如只让用户沿对角线方向移动光标?
  • @sadesoda 当然。您需要修改方法movingRect() 以强制执行平方算法。 x 的变化量必须与 y 的变化量相同。最后,self.rectx1self.rectx1 必须给你一个正方形。如果您确实需要帮助,请将您的问题作为新问题发布,因为此部分用于评论答案。
猜你喜欢
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 2022-07-05
  • 2016-10-28
  • 2013-09-03
相关资源
最近更新 更多