如何放置按钮图片 borderless/tansparent

How to put a button image borderless/tansparent

我正在尝试让我的按钮无边框,这样我们就可以在背景上看到进度条 我尝试了所有论坛,但无法将按钮的边框放在圆形或制作类似第二张图片的东西 这是按钮代码的一部分:

bg3 = Image.open("blanc.png")
resized_bg03 = bg3.resize((20, 20),Image.ANTIALIAS)
new_bg03 = ImageTk.PhotoImage(resized_bg03)   
s = Button(Fenetre,image=new_bg03,borderwidth=0,highlightthickness=0)
s.place(x=600, y=10,height = 20 , width = 20) 

我想要更像这样的东西,有一个圆圈,没有边框:

谁能帮帮我 :)

试试这个:

import tkinter as tk

# Kindly plagiarised from: 
def _create_circle(self, x, y, r, **kwargs):
    return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)
tk.Canvas.create_circle = _create_circle


# Please suggest a better name for the class
class ProgressBar(tk.Canvas):
    def __init__(self, height=20, radius=6, width=400, circle_colour="black",
                 colour="red", bar_width=6, bd=0, highlightthickness=0,
                 anti_bar_colour="white", **kwargs):
        super().__init__(height=height, width=width, bd=bd,
                         highlightthickness=highlightthickness, **kwargs)
        self.radius = radius
        self.height = height
        self.width = width
        self.rectangle = None
        self.circle_colour = circle_colour
        self.colour = colour
        self.bar_width = bar_width
        self.circle = None
        self.button_1_down = False
        self.create_anti_bar(anti_bar_colour)
        self.progress = 0
        super().bind("<Enter>", self.show_circle)
        super().bind("<Leave>", self.hide_circle)
        super().bind("<Button-1>", self.mouse_click)
        super().bind("<ButtonRelease-1>", self.mouse_release)
        super().bind("<B1-Motion>", self.mouse_motion)

    def create_anti_bar(self, colour):
        start_y = (self.height - self.bar_width)/2
        end_y = self.height - start_y
        start_x = self.radius
        end_x = self.width - self.radius
        # Change it to >= if you don't what the bar to appear when the
        # progress is at 0
        if start_x > end_x:
            return None
        super().create_rectangle(start_x, start_y, end_x, end_y,fill=colour,
                                 outline=colour)

    def mouse_click(self, event):
        self.button_1_down = True
        self.progress = (event.x - self.radius)/(self.width - 2*self.radius)

    def mouse_release(self, event=None):
        self.button_1_down = False

    def mouse_motion(self, event):
        if self.button_1_down:
            self.mouse_click(event)

    def hide_circle(self, event=None):
        if self.circle is not None:
            super().delete(self.circle)
            self.circle = None

    def show_circle(self, event=None):
        # Try removing the circle if we can
        self.hide_circle()
        x = (self.width - 2*self.radius)*self._progress + self.radius
        self.circle = super().create_circle(x, self.height//2, self.radius,
                                            fill=self.circle_colour,
                                            outline=self.circle_colour)

    def update_bar(self):
        # Try removing the progress bar
        if self.rectangle is not None:
            super().delete(self.rectangle)

        start_y = (self.height - self.bar_width)/2
        end_y = self.height - start_y
        start_x = self.radius
        end_x = (self.width - 2*self.radius)*self._progress + self.radius
        # Change it to >= if you don't what the bar to appear when the
        # progress is at 0
        if start_x > end_x:
            return None
        self.rectangle = super().create_rectangle(start_x, start_y, end_x,
                                                  end_y, fill=self.colour,
                                                  outline=self.colour)

    @property
    def progress(self):
        return self._progress

    @progress.setter
    def progress(self, new_value):
        # Check if the new_value is in the correct range
        if new_value < 0:
            new_value = 0
        elif new_value > 1:
            new_value = 1
        # Update self._progress
        self._progress = new_value
        # Update the progress bar
        self.update_bar()
        # If the circle was shown update it
        if self.circle is not None:
            self.show_circle()


if __name__ == "__main__":
    root = tk.Tk()
    pbar = ProgressBar()
    pbar.pack()
    pbar.progress = 0

    # keep incrementing the progress until the end then stop
    def increment_progress():
        pbar.progress += 0.001
        if pbar.progress >= 1:
            return None
        pbar.after(10, increment_progress)

    increment_progress()
    root.mainloop()

如果您不明白任何方法的作用,请告诉我。代码太多无法正确注释