web-dev-qa-db-ja.com

丸いボタンtkinter python

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'
6

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"_を使用すると、ボタンの境界線が削除されます。

ボタンの背景の背景がTkinterウィンドウと同じになるように_self.roundedborder["bg"] = "white"_を追加しました。

すばらしい点は、通常のボタンの形だけでなく、好きな形を使用できることです。

8
Simon

最初にルートウィンドウ(または他のウィジェット)を作成し、異なるパラメーターとともにCustomButtonに渡す必要があります(___init___メソッドの定義を参照)。

app = CustomButton()の代わりに次を試してください:

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

コンストラクタに引数を渡していません。

正確には、この行で

app = CustomButton()

コンストラクター定義で定義された引数、つまりparentwidthheightおよびcolorを渡す必要があります。

2
frederick99