【发布时间】:2021-06-02 08:45:58
【问题描述】:
我想创建一个自定义矩形小部件(如下所示),只需单击并移动鼠标即可调整大小。我为小部件创建了一个类:
from tkinter import *
class Rect(Canvas):
def __init__(self, parent,x1,y1,x2,y2,color = 'yellow',transparentcolor = 'grey', default="", **kwargs):
Canvas.__init__(self, parent)
self.parent=parent
self.canvas = Canvas(parent, width = x2+10,height = y2+10,bg='grey',cursor='hand2')
self.current= self.canvas
self.rect = self.canvas.create_rectangle(x1,y1,x2,y2, width=5,outline=color)
self.corner1 = self.canvas.create_oval(x1-10,y1-10,x1+10,y1+10,fill=color) # Top-left
self.corner2 = self.canvas.create_oval(x2-10,y1-10,x2+10,y1+10,fill=color) # Top-right
self.corner3 = self.canvas.create_oval(x1-10,y2-10,x1+10,y2+10,fill=color) # Below-left
self.corner4 = self.canvas.create_oval(x2-10,y2-10,x2+10,y2+10,fill=color) # Below-right
self.canvas.grid()
输出:
这是我的完整代码:
from tkinter import *
from custom_rect import Rect
from tkinter import Canvas
x1 = 12
y1 = 12
x2 = 400
y2 = 400
class DrawCircles(Frame):
def __init__(self, master=None, **kwargs):
super().__init__(master, **kwargs)
self.image = Canvas(self, width=800,height=800)
self.rect = Rect(self.image,x1,y1,x2,y2,color='green')
self.image.tag_bind(self.rect, '<Button-1>', self.on_click_rectangle)
self.image.tag_bind(self.rect, '<Button1-Motion>', self.on_motion)
def on_click_rectangle(self, tag, event):
self.current = tag
global x1,x2,y1,y2
if abs(event.x-x1) < abs(event.x-x2):
x1, x2 = x2, x1
if abs(event.y-y1) < abs(event.y-y2):
y1, y2 = y2, y1
self.start = x1, y1
print(x1,y1,x2,y2)
def on_motion(self, event):
self.coords(self.rect, *self.start, event.x, event.y)
def main():
main = DrawCircles()
main.pack()
main.mainloop()
if __name__ == '__main__':
main()
但是当我运行这段代码时,我得到了一个错误。
_tkinter.TclError: invalid boolean operator in tag search expression
我不确定,但错误是否来自移动部分?
【问题讨论】:
-
运行您的代码时出现了不同的异常:
AttributeError: 'Canvas' object has no attribute 'wm_attributes'。 -
另外,
self.rect是Rect的一个实例,它不能用作.tag_bind(...)中的tag(第一个参数)。 -
你能告诉我你的最终目标吗?你想干什么。你想在画布上有一个可以调整大小的矩形吗?还是您想使用这些点来调整整个窗口的大小?
-
我得到
'wm_attributes'.后才评论,那我怎么用tag_bind呢? @acw1668 -
其实我会在背景中添加一张图片。我在前景中使用这个可调整大小的矩形来选择图像的一部分。@Art
标签: python python-3.x tkinter tkinter-canvas