[英]How to make a Button using the tkinter Canvas widget?
我想從Canvas中獲取一個按鈕。 我試圖在按鈕小部件中pack
畫布,但這不起作用。 谷歌搜索了一下,我發現(這里: 你如何在tkinter Canvas上創建一個Button? ),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
線,我可以看到我的畫,但我不能(顯然)點擊它。 但是通過這種方式,按鈕小部件覆蓋了我的圈子並顯示了一個悲傷的空按鈕。
基本上,我想創建一個內部塗有紅色圓圈的按鈕。
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>
和<Leave>
上設置綁定(以模擬活動狀態),並確保光標位於按鈕釋放按鈕上方 - 請注意實際按鈕是如何進行的如果在釋放之前將鼠標移開,則不要做任何事情。
你可以做的是將畫布綁定到鼠標:
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
。 如果你想要讓這個click
,才會調用當用戶點擊這個圈子,你可以使用event.x
和event.y
得到的保持x
和y
點擊的坐標。 完成后,您可以運行計算以確定這些坐標是否在圓內。 這是對此的參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.