如何解决Python 3.9-Tkinter-自定义窗口小部件类事件绑定
我正在尝试基于Tkinter“ Entry”小部件创建一个名为“ TkinterEntryBox”的自定义搜索框类,当在文本输入区域内按下鼠标左键时,该类将清除其内容。当前,我正在尝试绑定一个名为“ clear”的函数,该函数是自定义类的一部分,该函数将清除父窗口中包含“ TkinterEntryBox”小部件实例的输入。 我读到从“ Entry”类继承是解决我的问题的首选方法,但是我想使用组合而不是继承,因为我不想在自定义类之外使用“ Entry”类“泄漏”。
问题是,按预期方式调用回调函数时,其“事件”参数包含绑定的“条目”类窗口小部件实例,而不是“ TkinterEntryBox”实例。由于“ Entry”类没有“ clear”方法,因此会导致异常。
是否可以强制Tkinter绑定我的自定义类而不是“ Entry”类,以便回调函数中的“ event”参数将在“ widget”属性下包含我的自定义类实例,以便我可以安全地调用“ clear” “ 方法?此外,由于我是Tkinter的新手,所以GUI编程可以有人使用,请告诉我这种创建小部件的方法是否有效?如果没有,那么我将非常感谢一些指针来改进我的代码。
以下是我到目前为止所创建的内容的大致概念:
下面是自定义条目类,该类是我想通过事件回调调用的“清除”方法:
class TkinterEntryBox:
def __init__(self,parent_window: BaseWindow,events_to_callbacks_bindings: Dict[str,Callable]):
self._tkinter_entry = Entry(parent_window)
self._bind_callbacks_to_events(events_to_callbacks_bindings)
def clear(self) -> None:
self._tkinter_entry.delete(ENTRY_BOX_POINTER_START_INDEX,ENTRY_BOX_POINTER_TO_END)
def input(self) -> str:
return self._tkinter_entry.get()
def set(self,text: str) -> None:
self._tkinter_entry.insert(ENTRY_BOX_POINTER_START_INDEX,text)
def place(self,placement_orientation: Geometry) -> None:
self._tkinter_entry.pack(side=str(placement_orientation))
def _bind_callbacks_to_events(self,Callable]) -> None:
for event_name,callback_function in events_to_callbacks_bindings.items():
self._bind_callback_to_event(event_name,callback_function)
def _bind_callback_to_event(self,event_name: str,callback_function: Callable) -> None:
self._tkinter_entry.bind(event_name,callback_function)
这是我初始化自定义输入框类的方式:
def _initialize_search_entry_box(self,factory: TkinterWidgetFactory) -> TkinterEntryBox:
events_to_callbacks_bindings = {
EVENT_ON_LEFT_MOUSE_BUTTON_DOWN: self._on_left_mouse_button_down
}
search_entry_box = factory.assemble_entry_box(self,INGREDIENT_SEARCH_BOX_PLACEHOLDER,events_to_callbacks_bindings)
return search_entry_box
这是在输入框输入区域内按下鼠标左键时调用的回调函数:
@staticmethod
def _on_left_mouse_button_down(event) -> None:
event.widget.clear()
在上述函数调用中收到的错误消息是:
AttributeError: 'Entry' object has no attribute 'clear'
解决方法
您可以在创建条目后简单地添加self._tkinter_entry.clear = self.clear
:
class TkinterEntryBox:
def __init__(self,parent_window: BaseWindow,events_to_callbacks_bindings):
self._tkinter_entry = Entry(parent_window)
self._tkinter_entry.clear = self.clear
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。