Tkinter does not allow you to directly draw widgets other than canvas, and canvas drawings will always be below the built-in widgets.
A simple solution is to create a button effect using only the canvas. There is nothing special about this: just create a canvas, then add bindings for ButtonPress and ButtonRelease to simulate the button you clicked.
Here is a rough idea:
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()
To complete the illusion, you want to set the binding to <Enter> and <Leave> (to simulate an active state), and also make sure that the cursor is above the button on the release button - note how real buttons do nothing if you release the mouse before release.
source share