Zag*_*rax 7 python tkinter button tkinter-canvas
我想从Canvas中获取一个按钮.我已尝试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()
Run Code Online (Sandbox Code Playgroud)
如果我擦掉create_window线条,我可以看到我的画,但我不能(显然)点击它.但是通过这种方式,按钮小部件覆盖了我的圈子并显示了一个悲伤的空按钮.
基本上,我想创建一个内部涂有红色圆圈的按钮.
Bry*_*ley 12
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()
Run Code Online (Sandbox Code Playgroud)
为了完成你要设置一个具有约束力的错觉<Enter>和<Leave>(模拟激活状态),同时确保光标在按钮上松开按钮-注意按钮如何真正不,如果你做任何事释放之前将鼠标移开.
小智 5
您可以做的是将画布绑定到鼠标:
import Tkinter
DIM = 100
root = Tkinter.Tk()
frame = Tkinter.Frame(root)
circle = Tkinter.Canvas(frame)
circle.create_oval(5, 5, DIM-5, DIM-5, fill="red")
frame.grid()
circle.grid(row=1, column=1)
##################################
def click(event):
root.quit()
circle.bind("<Button-1>", click)
##################################
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
现在,如果用户在画布内单击,click将调用函数(本质上,画布现在已成为按钮)。
请注意,如果用户单击画布中的任意位置click,则会调用该函数。如果您想让它仅在用户单击圆圈时调用,您可以使用和来获取单击的和坐标。一旦有了这些,您就可以运行计算来确定这些坐标是否在圆内。 这是对此的参考。clickevent.xevent.yxy