python - 不将“主”传递给小部件有什么影响?
问题描述
当我在 GUI 上工作时,我遇到了由于类型提示而导致循环导入的问题,并且提供的答案有效,但它开始污染源代码,因为每个小部件类都导入它需要实例化的类,并且每个实例化的小部件都需要导入调用者,以便它可以输入提示:
# navbar.py
import tkinter as tk
from filemenu import FileMenu
class NavBar(tk.Menu):
def __init__(self, parent: tk.Tk, **kwargs) -> None:
super().__init__(parent, **kwargs)
self.add_cascade(label='File', menu=FileMenu(self, tearoff=False))
# filemenu.py
import tkinter as tk
from typing import TYPE_CHECKING:
from navbar import NavBar
# from navbar import NavBar # using this causes cyclic import failure
class FileMenu(tk.Menu):
def __init__(self, parent: 'NavBar', **kwargs) -> None:
super().__init__(parent, **kwargs)
self.add_command(label='Settings', command=self.open_settings)
def open_settings(self) -> None:
print(self.master.__class__)
该类NavBar
实例化一个FileMenu
类,因此模块必须 import FileMenu
。问题出现在filemenu.py
参数__init__
被parent
键入为父小部件的地方,在这种情况下是一个NavBar
实例。为了做到这一点,navbar.py
必须从导入和循环导入开始。
但是,我尝试了一个Menu
带有下拉菜单的选项:
# navbar.py
import tkinter as tk
from filemenu import FileMenu
class NavBar(tk.Menu):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.add_cascade(label='File', menu=FileMenu(tearoff=False))
# filemenu.py
import tkinter as tk
class FileMenu(tk.Menu):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.add_command(label='Settings', command=self.open_settings)
def open_settings(self) -> None:
print(self.master.__class__)
# main.py
import tkinter as tk
from navbar import NavBar
if __name__ == '__main__':
root = tk.Tk()
root.configure(menu=NavBar())
root.mainloop()
打开一个带有下拉菜单的窗口,该菜单tk.Tk()
将self.master.__class__
.
不传递master
参数会有影响吗?effbot 文档将其显示master=None
为大多数(如果不是全部)小部件,因此是可选的。
解决方案
不传递主参数是否有影响?
小部件存在于树状层次结构中。除了根小部件之外的每个小部件都必须有一个父小部件(或有时称为主小部件)。如果您不提供父级,则根窗口将用作父级。除了非常简单的程序外,这通常不是正确的做法。
推荐阅读
- python - 当它们在熊猫列中时如何检查一个列表的元素是否是另一个
- rabbitmq - Google 日历 API:com.google.api.client.googleapis.json.GoogleJsonResponseException:404 未找到
- c++ - C++ 调整 2d 向量的大小,其中函数为 const
- python - pytest - 将值从一个测试函数传递到测试文件中的另一个函数
- mysql - 有没有办法将值插入到一个表中,然后更新另一个表中的值?mysql
- java - Google Foobar 问题 - 请传递编码消息 (Java)
- python - 从公共输入分支和合并 Apache Beam 中的 pcollection 列表
- html - 挣扎于使用 CSS 对齐按钮
- android - 发现名称冲突的设置器:setWallpaper
- r - 比较矩阵的行并替换匹配的元素