简单的 Tk 应用程序 - 单击按钮即可绘制
Posted
技术标签:
【中文标题】简单的 Tk 应用程序 - 单击按钮即可绘制【英文标题】:simple Tk application - draw on the click of a button 【发布时间】:2013-01-23 12:54:26 【问题描述】:谁能告诉我为什么单击 self.rec 按钮时我的 'addLine' 方法无法调用?
from tkinter import *
from tkinter import ttk
root = Tk()
class Paint:
def __init__(self, parent):
self.parent = parent
self.whiteBoard = Canvas(self.parent)
self.whiteBoard.grid(column=0, row=0, sticky=(N,W,E,S))
self.lastx = 0
self.lasty = 0
self.rec = self.whiteBoard.create_rectangle((10, 10, 30, 30), fill="red")
self.whiteBoard.tag_bind(self.rec, "<Button-1>", self.getClick)
def xy(self, event):
self.lastx, self.lasty = event.x, event.y
print (event.x, " is the x coordinate")
print (event.y, " is the y coordinate")
def addLine(self, event):
canvas.create_line((lastx, lasty, event.x, event.y))
self.lastx, self.lasty = event.x, event.y
def getClick(self, event):
self.whiteBoard.bind("<Button-1>", self.xy)
self.whiteBoard.bind("B1-Motion>", self.addLine)
white = Paint(root)
root.mainloop()
这都是尝试使用 Tkinter 制作 MS 绘画克隆的一部分。
【问题讨论】:
这里不用lambda
。 self.whiteBoard.tag_bind(self.rec, "<Button-1>", self.getClick)
或 `self.whiteBoard.tag_bind(self.rec, "def addLine(self, event): canvas.create_line((lastx, lasty, event.x, event.y)) self.lastx, self.lasty = event.x, event.y def getClick(self, event): self.whiteBoard.bind("<Button-1>", self.xy) self.whiteBoard.bind("B1-Motion>", self.addLine)
【参考方案1】:
首先,您绑定到B1-Motion>
(注意缺少的<
)。但是,更重要的是,不要做这样的绑定。看起来getClick
方法实际上是“选择线条工具”。然后,将绑定 <Button-1>
和 <B1-Motion>
添加到画布本身。当回调被调用时,您根据所选工具执行操作。
这是遵循此建议的粗略草图(带有RECTANGLE
工具作为奖励):
import tkinter
# TOOLS
LINE, RECTANGLE = list(range(2))
class Paint:
def __init__(self, canvas):
self.canvas = canvas
self._tool, self._obj = None, None
self.lastx, self.lasty = None, None
self.canvas.bind('<Button-1>', self.update_xy)
self.canvas.bind('<B1-Motion>', self.draw)
def draw(self, event):
if self._tool is None or self._obj is None:
return
x, y = self.lastx, self.lasty
if self._tool in (LINE, RECTANGLE):
self.canvas.coords(self._obj, (x, y, event.x, event.y))
def update_xy(self, event):
if self._tool is None:
return
x, y = event.x, event.y
if self._tool == LINE:
self._obj = self.canvas.create_line((x, y, x, y))
elif self._tool == RECTANGLE:
self._obj = self.canvas.create_rectangle((x, y, x, y))
self.lastx, self.lasty = x, y
def select_tool(self, tool):
print('Tool', tool)
self._tool = tool
class Tool:
def __init__(self, whiteboard, parent=None):
self.whiteboard = whiteboard
frame = tkinter.Frame(parent)
self._curr_tool = None
for i, (text, t) in enumerate((('L', LINE), ('R', RECTANGLE))):
lbl = tkinter.Label(frame, text=text, width=2, relief='raised')
lbl._tool = t
lbl.bind('<Button-1>', self.update_tool)
lbl.pack(padx=6, pady=6*(i % 2))
frame.pack(side='left', fill='y', expand=True, pady=6)
def update_tool(self, event):
lbl = event.widget
if self._curr_tool:
self._curr_tool['relief'] = 'raised'
lbl['relief'] = 'sunken'
self._curr_tool = lbl
self.whiteboard.select_tool(lbl._tool)
root = tkinter.Tk()
canvas = tkinter.Canvas(highlightbackground='black')
whiteboard = Paint(canvas)
tool = Tool(whiteboard)
canvas.pack(fill='both', expand=True, padx=6, pady=6)
root.mainloop()
【讨论】:
很抱歉再次打扰您,但您能否给我一些关于如何创建几个绘制椭圆和矩形的新工具的指示?我一直在尝试,但我只是以更多的线条结束。我添加了一个用于绘制矩形的新按钮并更新了“update_xy”方法以包含recs 即elif self._tool == RECTANGLE: self._obj = self.canvas.create_rectangle((self.lastx, self.lasty, x, y))
但我仍在绘制线条。这与需要一条线的坐标有关吗?
@user2038497 看来我们无处可去。每次解决一个问题时,您都会在同一个问题中创建另一个问题。
@user2038497 查看更新后的答案,请注意,这会使您的其他问题与此问题重复。
@mmpg 抱歉,我不知道发帖礼仪的这一部分。感谢您的帮助。以上是关于简单的 Tk 应用程序 - 单击按钮即可绘制的主要内容,如果未能解决你的问题,请参考以下文章