python tkinter圆形按钮有白色边框

j2cgzkjk  于 2023-01-29  发布在  Python
关注(0)|答案(2)|浏览(150)

我设法在tkinter中找到一个为圆形按钮创建类的人,这个类工作得很好。但是我遇到的问题是总是有一个白色的边框。我试着阅读所有的代码,改变所有的颜色值,但是没有用。
下面是一段代码的摘录,我已经尽可能地把它格式化了:

from tkinter import Tk, Canvas

class RoundedButton(Canvas):
    def __init__(self, master=None, text: str = "", radius=25, btnforeground="#007CEE", btnbackground="#ffffff",
                 clicked=None, font=("Righteous", 25), *args, **kwargs):
        super(RoundedButton, self).__init__(master, *args, **kwargs)
        self.config(bg=self.master["bg"])
        self.btnbackground = btnbackground
        self.btnforeground = btnforeground
        self.clicked = clicked

        self.radius = radius

        self.rect = self.round_rectangle(0, 0, 0, 0, tags="button", radius=radius, fill=btnbackground)
        self.text = self.create_text(0, 0, text=text, tags="button", fill=btnforeground, font=font,
                                     justify="center")

        self.tag_bind("button", "<ButtonPress>", self.border)
        self.tag_bind("button", "<ButtonRelease>", self.border)
        self.bind("<Configure>", self.resize)

        text_rect = self.bbox(self.text)
        if int(self["width"]) < text_rect[2] - text_rect[0]:
            self["width"] = (text_rect[2] - text_rect[0]) + 10

        if int(self["height"]) < text_rect[3] - text_rect[1]:
            self["height"] = (text_rect[3] - text_rect[1]) + 10

    def round_rectangle(self, x1, y1, x2, y2, radius=25, update=False,
                        **kwargs):  # if update is False a new rounded rectangle's id will be returned else updates existing rounded rect.
        # source: https://stackoverflow.com/a/44100075/15993687
        points = [x1 + radius, y1,
                  x1 + radius, y1,
                  x2 - radius, y1,
                  x2 - radius, y1,
                  x2, y1,
                  x2, y1 + radius,
                  x2, y1 + radius,
                  x2, y2 - radius,
                  x2, y2 - radius,
                  x2, y2,
                  x2 - radius, y2,
                  x2 - radius, y2,
                  x1 + radius, y2,
                  x1 + radius, y2,
                  x1, y2,
                  x1, y2 - radius,
                  x1, y2 - radius,
                  x1, y1 + radius,
                  x1, y1 + radius,
                  x1, y1]

        if not update:
            return self.create_polygon(points, **kwargs, smooth=True)

        else:
            self.coords(self.rect, points)

    def resize(self, event):
        text_bbox = self.bbox(self.text)

        if self.radius > event.width or self.radius > event.height:
            radius = min((event.width, event.height))

        else:
            radius = self.radius

        width, height = event.width, event.height

        if event.width < text_bbox[2] - text_bbox[0]:
            width = text_bbox[2] - text_bbox[0] + 30

        if event.height < text_bbox[3] - text_bbox[1]:
            height = text_bbox[3] - text_bbox[1] + 30

        self.round_rectangle(5, 5, width - 5, height - 5, radius, update=True)

        bbox = self.bbox(self.rect)

        x = ((bbox[2] - bbox[0]) / 2) - ((text_bbox[2] - text_bbox[0]) / 2)
        y = ((bbox[3] - bbox[1]) / 2) - ((text_bbox[3] - text_bbox[1]) / 2)

        self.moveto(self.text, x, y)

    def border(self, event):
        if event.type == "4":
            self.itemconfig(self.rect, fill="#DE8500")
            self.itemconfig(self.text, fill='#ffffff')
            if self.clicked is not None:
                self.clicked()

        else:
            self.itemconfig(self.rect, fill=self.btnbackground)
            self.itemconfig(self.text, fill=self.btnforeground)

window = Tk()
window.geometry("1440x872")
window.configure(bg="#007CEE")

download_button_1 = RoundedButton(
    text="Download",
    font=("Righteous", 30),
    borderwidth=0)
download_button_1.place(
    x=409,
    y=383,
    width=621.0,
    height=105.0
)

window.mainloop()

编辑:Furas的回答非常完美,对于任何对使用这个圆形按钮类感兴趣的人,我建议在self.create_polygon中将样条步长改为更高的值,以帮助平滑

return self.create_polygon(points, **kwargs, smooth=True, splinesteps=10000)
wko9yo5t

wko9yo5t1#

在Linux上对我有用

highlightthickness=0

或设置背景颜色

highlightbackground="#007CEE"

最后

borderwidth=-1

Canvas的文档(archive.org上的第effbot.org页)显示了所有配置选项。
之前:

之后:

bvhaajcl

bvhaajcl2#

2023年1月28日:使用:流行!_操作系统22.04 LTS //Python 3.10.6// Tcl/Tk版本8.6
“borderwidth=-1”似乎不起作用,但“highlightthickness=0”似乎完全符合我的预期。Resulting button with rounded corners

相关问题