如何在Tkinter中通过点击子框架和相应按钮绘制几何图形
我创建了一个框架,但不知道怎么在子框架上绘制图形。
这是我当前窗口的代码:
class App:
def __init__(self, master):
frame = Frame(master)
frame.grid()
self.Quit = Button(frame, text = "QUIT", command = frame.quit)
self.Quit.grid(row = 0, column = 48, sticky = N)
self.adpt = Button(frame, text = "Add Point", command = self.adpt)
self.adpt.grid(row = 0, column = 49, sticky = N)
self.adln = Button(frame, text = "Add Line", command = self.adln)
self.adln.grid(row = 0, column = 50, sticky = N)
self.adpg = Button(frame, text = "Add Polygon", command = self.adpg)
self.adpg.grid(row = 0, column = 51, stick = N)
iframe = Frame(frame, bd = 2, relief = RAISED, width=1000, height=500)
iframe.grid(row = 1, columnspan = 100, sticky = N)
def adpt(self):
pass
def adln(self):
pass
def adpg(self):
pass
我需要通过点击相应的按钮来创建各种图形,然后把它们绘制在子框架上,但我不知道怎么用事件在子框架(iframe)中绘图。比如说,点击“添加点”按钮来绘制一个点。然后在子框架上点击一下来生成一个点。双击子框架可以把这些点保存到一个点列表里。
第一个问题是,怎么在子框架上通过点击来绘制点。
第二个问题是,怎么让子框架分别处理单击和双击事件。当我双击一个小部件时,它会先触发单击事件,然后再触发双击事件。
我已经创建了可以用画布绘制图形的类。点、线、多边形的类都可以用画布来绘制图形。
这是点类的示例代码:
class Point:
def __init__(self,x, y):
self.x = x
self.y = y
def __str__(self):
return " (" + str(self.x) + "," + str(self.y) + ")"
def draw(self,canvas):
canvas.create_line(self.x-10,self.y,self.x+10,self.y)
canvas.create_line(self.x,self.y-10,self.x,self.y+10)
1 个回答
0
如果你是通过按钮来选择几何图形的类型,在按钮的事件处理程序中,你可以设置将要使用的类。然后,你可以利用事件信息中的坐标在画布上绘制这个图形。
self.adln = Button(frame, text = "Add Line", command=self.adln)
self.adpt = Button(frame, text = "Add Point", command=self.adpt)
self.canvas.bind("<Button-1>", self.click)
#...
def adln(self):
self.geometry = "Line"
def adpt(self):
self.geometry = "Points"
#...
def click(self, event):
if self.start is None:
self.start = (event.x, event.y)
else:
self.draw_geometry()
self.start = None
def draw_geometry(self):
if self.geometry == "Points":
p1 = Point(*self.start)
p2 = Point(event.x, event.y)
p1.draw(self.canvas)
p2.draw(self.canvas)
elif self.geometry == "Line":
line = Line(event.x, event.y, *self.start)
line.draw(self.canvas)
注意,构造函数的参数数量和是否存在 draw
方法可能和你实际的情况不一样,因为这只是一个示例。这种写法有点儿 不太符合Python的风格,但这是我想到的最简单的方法。
另一方面,由于事件 <Button-1>
是在双击时触发的,我建议你使用其他按钮来执行不同的操作,比如 <Button-2>
或 <Button-3>
。