9

Canvas からボタンを取得したい。packボタンウィジェットでキャンバスを試してみましたが、うまくいきませんでした。少しグーグルで調べてみると (ここ: How do you create a Button on a tkinter Canvas? ) Canvas メソッドcreate_windowが役立つかもしれないことがわかりました。しかし、私がそれを使用している方法には何か問題があるはずです。

import Tkinter

DIM = 100

root = Tkinter.Tk()
frame = Tkinter.Frame(root)

button = Tkinter.Button(None, width=DIM, height=DIM, command=root.quit)

circle = Tkinter.Canvas(frame, width=DIM, height=DIM)
circle.create_oval(5, 5, DIM-5, DIM-5, fill="red")
circle.create_window(0, 0, window=button)

frame.grid()
circle.grid(row=1, column=1)

root.mainloop()

線を消せばcreate_window絵を見ることはできますが、(明らかに) クリックすることはできません。しかし、この方法では、ボタン ウィジェットが私の円を覆い、悲しい空のボタンが表示されます。

基本的には、赤い丸が内側に描かれたボタンを作成したいと考えています。

4

2 に答える 2

15

Tkinter では、キャンバス以外のウィジェットに直接描画することはできず、キャンバスの描画は常に埋め込みウィジェットの下にあります。

簡単な解決策は、キャンバスだけを使用してボタンの効果を作成することです。これを行うのに特別なことは何もありません。キャンバスを作成し、ButtonPress と ButtonRelease のバインディングを追加して、ボタンが押されていることをシミュレートします。

大まかなアイデアは次のとおりです。

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()

錯覚を完成させるには、(アクティブな状態をシミュレートするために) <Enter>andにバインディングを設定<Leave>し、ボタンを離すときにカーソルがボタンの上にあることを確認します。離す前にマウスを離します。

于 2013-10-14T22:00:15.610 に答える