圆形按钮tkinter python

时间:2017-03-03 13:17:07

标签: python tkinter tkinter-canvas

我正在尝试使用tkinter获取脚本的圆角按钮。

我找到了以下代码:

from tkinter import *
import tkinter as tk

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()
app = CustomButton()
app.mainloop()

但是我收到以下错误:

TypeError: __init__() missing 4 required positional arguments: 'parent', 'width', 'height', and 'color'

4 个答案:

答案 0 :(得分:8)

如果有人要寻找更多的苹果外观或其他东西,我就做了一个圆角的矩形按钮。为了方便起见,以下是参数:

RoundedButton(parent, width, height, cornerradius, padding, fillcolor, background, command)

注意: 如果拐角半径大于宽度或高度的一半,则会在终端中发送错误消息。如果将拐角半径设置为高度或宽度的一半,则仍然可以制作出药丸形状。

最后的代码:

from tkinter import *
import tkinter as tk

root = Tk()

class RoundedButton(tk.Canvas):
    def __init__(self, parent, width, height, cornerradius, padding, color, bg, command=None):
        tk.Canvas.__init__(self, parent, borderwidth=0, 
            relief="flat", highlightthickness=0, bg=bg)
        self.command = command

        if cornerradius > 0.5*width:
            print("Error: cornerradius is greater than width.")
            return None

        if cornerradius > 0.5*height:
            print("Error: cornerradius is greater than height.")
            return None

        rad = 2*cornerradius
        def shape():
            self.create_polygon((padding,height-cornerradius-padding,padding,cornerradius+padding,padding+cornerradius,padding,width-padding-cornerradius,padding,width-padding,cornerradius+padding,width-padding,height-cornerradius-padding,width-padding-cornerradius,height-padding,padding+cornerradius,height-padding), fill=color, outline=color)
            self.create_arc((padding,padding+rad,padding+rad,padding), start=90, extent=90, fill=color, outline=color)
            self.create_arc((width-padding-rad,padding,width-padding,padding+rad), start=0, extent=90, fill=color, outline=color)
            self.create_arc((width-padding,height-rad-padding,width-padding-rad,height-padding), start=270, extent=90, fill=color, outline=color)
            self.create_arc((padding,height-padding-rad,padding+rad,height-padding), start=180, extent=90, fill=color, outline=color)


        id = shape()
        (x0,y0,x1,y1)  = self.bbox("all")
        width = (x1-x0)
        height = (y1-y0)
        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()

def test():
    print("Hello")

canvas = Canvas(root, height=300, width=500)
canvas.pack()

button = RoundedButton(root, 200, 100, 50, 2, 'red', 'white', command=test)
button.place(relx=.1, rely=.1)

root.mainloop()

答案 1 :(得分:5)

在tkinter中制作圆角按钮的一种非常简单的方法是使用图像。

首先创建一个想要按钮的图像,将其保存为.png并删除外部背景,使其呈圆形,如下所示:

Click here to see image

接下来将图像插入一个PhotoImage按钮,如下所示:

self.loadimage = tk.PhotoImage(file="rounded_button.png")
self.roundedbutton = tk.Button(self, image=self.loadimage)
self.roundedbutton["bg"] = "white"
self.roundedbutton["border"] = "0"
self.roundedbutton.pack(side="top")

确保使用border="0",并删除按钮边框。

我添加了self.roundedborder["bg"] = "white",以便按钮背景的背景与Tkinter窗口相同。

最重要的是,你可以使用你喜欢的任何形状,而不仅仅是正常的按钮形状。

希望有所帮助

答案 2 :(得分:3)

您需要先创建根窗口(或其他一些小部件)并将其与不同参数一起提供给CustomButton(请参阅__init__方法的定义)。

尝试代替app = CustomButton()以下内容:

app = tk.Tk()
button = CustomButton(app, 100, 25, 'red')
button.pack()
app.mainloop()

答案 3 :(得分:1)

您没有将任何参数传递给构造函数。

确切地说,在这一行

app = CustomButton()

您需要传递构造函数定义中定义的参数,即parentwidthheightcolor