2013-10-14 19 views
6

キャンバスからボタンを取得したいと思います。私はpackボタンウィジェットのキャンバスにしようとしましたが、動作しませんでした。私はちょっとグーグルで、キャンバスメソッドcreate_windowが役に立つかもしれないことがわかりました(ここでは:How do you create a Button on a tkinter Canvas?)。しかし、私がそれを使用している方法に何か間違っているはずです。私はcreate_windowラインを消去した場合tkinter Canvasウィジェットを使用してボタンを作成するには?

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

、私はそれ自体、私の絵が、私は(明らかに)それをクリックすることはできません。しかし、このように、ボタンウィジェットは私の円を覆い、悲しい空のボタンを表示します。

基本的に、内側に赤い円が描かれたボタンを作成したいと思います。

答えて

10

Tkinterには、あなたが直接キャンバス以外のウィジェット上に描画することはできません。また、キャンバスの図面は、常に以下のウィジェットを埋め込まれます。

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

ここでは大まかなアイデアです:あなたは(アクティブ状態をシミュレートするため)<Enter><Leave>に結合を設定し、また、カーソルが上にあることを確認したいと思うような錯覚を完了するには

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

ボタン解除のボタン - あなたが解放する前に離れてマウスを移動する場合はどのように実際のボタンは何もしないに気づきます。

1

マウスをキャンバスに結合されて何を行うことができます:今

import Tkinter 

DIM = 100 

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

circle = Tkinter.Canvas(frame) 
circle.create_oval(5, 5, DIM-5, DIM-5, fill="red") 

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

################################## 
def click(event): 
    root.quit() 

circle.bind("<Button-1>", click) 
################################## 

root.mainloop() 

をユーザーがキャンバス内でクリックした場合、機能clickは(基本的に、キャンバスは今ボタンをなされている)と呼ばれます。

キャンバス内でユーザがの場合はどこでもをクリックすると、clickという関数が呼び出されます。あなたは、ユーザーが円でクリックしたときにclickのみが呼び出されるようにしたい場合は、クリックのxy座標を手に入れるためにevent.xevent.yを使用することができます。それらを取得したら、それらの座標がサークル内にあるかどうかを判断する計算を実行できます。 Hereはそれに関する参考資料です。

関連する問題