python - 如何从另一个类调用 QMainWindow 组件?
问题描述
我需要QMainWindow
从另一个类中调用 a 的对象,但我找不到让它工作的方法。这是问题的一个最小示例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
class Starter:
def __init__(self):
super(Starter, self).__init__()
print("starter")
MainWindow().show_label()
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("Start")
self.show()
def show_label(self):
print("show")
label = QLabel("Hallo")
self.setCentralWidget(label)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
Starter()
sys.exit(app.exec_())
窗口正常打开Starter class
并被调用,打印“starter”,也show_label
被调用,打印“show”,但标签没有出现在窗口中。这种方法有什么问题?
解决方案
首先,我建议您对类和实例是什么以及它们如何工作进行一些研究和研究。
然后另一个不能忽视的重要方面是垃圾收集,这就是 Python 如何确保在不再需要对象时不浪费内存。
这既适用于您在 Starter 中创建的 MainWindow 实例,也适用于Starter()
代码末尾的实例本身。
最后,在您的Starter
班级中,您没有使用MainWindow
您正在考虑的实例(在脚本末尾创建的那个),而是另一个在__init__()
Starter: 之外绝对没有任何参考的实例:一旦执行该行,该实例被删除。
考虑到上述方面,尝试以下修改并了解差异。
class Starter:
def __init__(self):
super(Starter, self).__init__()
self.mainWindow = MainWindow()
self.mainWindow.show_label()
# ...
if __name__ == '__main__':
app = QApplication(sys.argv)
starter = Starter()
sys.exit(app.exec_())
推荐阅读
- javascript - 从变量生成 json 对象并插入到另一个 json 对象中
- wordpress - 如何允许订阅者访问仪表板中的特定页面?
- python - 在 groupby 之后迭代 sum 的正确方法是什么
- sympy - Sympy 奇怪的求和解释
- laravel - 使用不同类型的响应为两者(Web 和 API)编写相同代码的最佳方法?
- python-3.x - 从右到左计算反向累积积
- xampp - Xampp 虚拟主机页面“不安全”
- apache - OAuth GConnect KeyError:'name' with Python on Ubuntu + apache on Amazon Lightsail
- java - 创建定义名称为“entityManagerFactory”的 bean 时出错
- arrays - 练习面试题在array[j] >= array[i]的条件下要求max ji;不明白解决办法