如何使用tkinter画布小部件制作按钮?
问题内容:
我想从“画布”中获取一个按钮。我尝试pack
在按钮小部件中使用画布,但这没有用。仔细搜索一下,我发现(这里:如何在tkinter
Canvas上创建Button?
)Canvas方法create_window
可能会有所帮助。但是我使用它的方式应该有问题。
import Tkinter
DIM = 100
root = Tkinter.Tk()
frame = Tkinter.Frame(root)
button = Tkinter.Button(None, width=DIM, height=DIM, command=root.quit)
circle = Tkinter.Canvas(frame, width=DIM, height=DIM)
circle.create_oval(5, 5, DIM-5, DIM-5, fill="red")
circle.create_window(0, 0, window=button)
frame.grid()
circle.grid(row=1, column=1)
root.mainloop()
如果我删除了create_window
线条,则可以查看我的画,但是不能(显然)单击它。但是通过这种方式,按钮小部件覆盖了我的圈子并显示了一个悲伤的空按钮。
基本上,我想创建一个带有红色圆圈的按钮。
问题答案:
Tkinter不允许您直接在画布之外的其他窗口小部件上绘图,并且画布图形将始终位于嵌入式窗口小部件的下方。
简单的解决方案是仅使用画布来创建按钮的效果。这样做确实没有什么特别的:只需创建一个画布,然后为ButtonPress和ButtonRelease添加绑定以模拟被按下的按钮。
这是一个大概的想法:
class CustomButton(tk.Canvas):
def __init__(self, parent, width, height, color, command=None):
tk.Canvas.__init__(self, parent, borderwidth=1,
relief="raised", highlightthickness=0)
self.command = command
padding = 4
id = self.create_oval((padding,padding,
width+padding, height+padding), outline=color, fill=color)
(x0,y0,x1,y1) = self.bbox("all")
width = (x1-x0) + padding
height = (y1-y0) + padding
self.configure(width=width, height=height)
self.bind("<ButtonPress-1>", self._on_press)
self.bind("<ButtonRelease-1>", self._on_release)
def _on_press(self, event):
self.configure(relief="sunken")
def _on_release(self, event):
self.configure(relief="raised")
if self.command is not None:
self.command()
要完成这种错觉,您需要在<Enter>
和上设置绑定<Leave>
(以模拟活动状态),并确保光标位于按钮释放按钮的上方-
注意,如果您使用真正的按钮,则什么也不做释放鼠标之前将其移开。