簡體   English   中英

展開 Python Tkinter Object 類型

[英]Expand Python Tkinter Object Types

發現現有類型有這個問題:

但是,我剛剛開發了分配給一些按鈕的工具提示(氣球),並希望能夠將所有這些按鈕作為一種獨特的類型來調用。 此外,我還想手工制作 canvas 對象,這些對象將像具有<enter><leave><active><press><release>事件的偽按鈕一樣操作。 我如何為他們聲明一個新的 object 類型?

Object 面向編程可能是解決方案。

如果我想創建 tkinter 按鈕的“新類型”,我可以對它進行子類化。

class MySpecialButton(tkinter.Button):
    pass

目前這並沒有做任何特別的事情,但會給它一個獨特的類型(如果它正確理解了你的解釋)

以下示例來自我的另一個答案,它創建了一個具有自定義行為的特殊按鈕,用於將鼠標懸停在按鈕上

class HoverButton(tk.Button):
    def __init__(self, master, **kw):
        tk.Button.__init__(self,master=master,**kw)
        self.defaultBackground = self["background"]
        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)

    def on_enter(self, e):
        self['background'] = self['activebackground']

    def on_leave(self, e):
        self['background'] = self.defaultBackground

關於 canvas object,您顯然也可以為這些創建類,其中可以包含移動/調整 object 大小的方法。 至於如何為這些創建自定義事件,您可以使用tag_bind(item, event=None, callback=None, add=None)將回調綁定到 canvas object。 下面是一個簡單的例子

import tkinter as tk

class CanvasShape:
    def __init__(self, canvas, callback = None):
        self.canvas = canvas
        self.id = canvas.create_oval(10,10,50,50,fill='blue')
        self.canvas.tag_bind(self.id,'<Button-1>',callback)

def clicked(e):
    print("You clicked on a shape")

root = tk.Tk()
c = tk.Canvas(root,width=200,height=200)
c.grid()
shape = CanvasShape(c,callback=clicked)

root.mainloop()

這將創建一個圓圈,當您單擊它時將觸發一個事件,該事件由clicked的 function 接收。

如果我正確理解您的問題,您想檢查創建的實例是否是自定義 class 的實例,可以使用isinstance直接完成:

class CustomTooltip():
    pass

cwidget = CustomTooltip()
btn     = tk.Button(root)

print(isinstance(cwidget, CustomTooltip)) # True
print(isinstance(b, CustomTooltip)) # False

print(type(cwidget) == CustomTooltip) # Not recommended

建議使用文檔中的isinstance而不是type

建議使用內置的isinstance() function 來測試 object 的類型,因為它考慮了子類。


我沒有完全得到你的第二個問題,最好將一個問題集中在一個主要問題上,而不是問一個以上的問題。

暫無
暫無

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

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