dre*_*423 5 python pyqt pyqt4 python-3.x
我有一个引擎模块,其中包含几个辅助方法和属性:
引擎.py
class World:
def __init__(self):
# stuff
def foo(a, b):
c = a + b # trivial example
return c
Run Code Online (Sandbox Code Playgroud)
然后我有一个 main.py,其中包含 UI 文件(在 QtDesigner 中创建并使用我拥有的脚本转换为 .py):
主要.py
from PyQt4 import QtGui
import design1
import design2
import engine
class MainWindow(QtGui.QMainWindow, design1.Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.world = engine.World()
self.new_window_button.clicked.connect(self.open_new_window)
def open_new_window(self):
self.window_to_open = ChildWindow(self)
self.window_to_open.show()
class ChildWindow(QtGui.QMainWindow, design2.Ui_MainWindow):
def __init__(self, parent):
super(ChildWindow, self).__init__(parent)
self.setupUi(self)
print(self.world.foo(1, 2)) # trivial example
def main():
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Run Code Online (Sandbox Code Playgroud)
如果我把线拔掉print,ChildWindow就可以正常打开。但随着它的出现,我得到了错误:
AttributeError:“ChildWindow”对象没有属性“world”
我知道我在做一些愚蠢的事情,但我无法弄清楚。
编辑main.py
from PyQt4 import QtGui
import design1
import design2
import engine
class MainWindow(QtGui.QMainWindow, design1.Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.world = engine.World()
self.new_window_button.clicked.connect(self.open_new_window)
def open_new_window(self):
self.window_to_open = ChildWindow(self)
self.window_to_open.show()
class ChildWindow(QtGui.QMainWindow, design2.Ui_MainWindow):
def __init__(self, parent):
super(ChildWindow, self).__init__(parent)
self.setupUi(self)
print(self.parent().world.foo(1, 2)) # trivial example
def main():
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Run Code Online (Sandbox Code Playgroud)
我现在收到错误:
类型错误:foo() 需要 2 个位置参数,但给出了 3 个
该类ChildWindow没有 world 属性,但您可以通过the parent()函数访问它,该函数返回父级,因为您使用了以下语句:self.window_to_open = ChildWindow (self)
你必须改变
self.world.foo(1, 2)
Run Code Online (Sandbox Code Playgroud)
到
self.parent().world.foo(1, 2)
Run Code Online (Sandbox Code Playgroud)
您的方法必须声明为静态,因为它不使用 self 作为参数。
class World:
def __init__(self):
# stuff
@staticmethod
def foo(a, b):
c = a + b # trivial example
return c
Run Code Online (Sandbox Code Playgroud)
或者
def foo(self, a, b):
c = a + b # trivial example
return c
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5074 次 |
| 最近记录: |