簡體   English   中英

如何使用tkinter Canvas小部件制作Button?

[英]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.xevent.y得到的保持xy點擊的坐標。 完成后,您可以運行計算以確定這些坐標是否在圓內。 是對此的參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM