2017-04-07 59 views
0

我有一个包含几个辅助方法和属性引擎模块:在PyQT中如何打开有权访问父级属性的子窗口?

engine.py

class World: 
    def __init__(self): 
     # stuff 

    def foo(a, b): 
     c = a + b # trivial example 
     return c 

然后我已经结合有UI文件main.py(在QtDesigner创建并转换为的.py使用脚本我有):

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.world.foo(1, 2)) # trivial example 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    app.exec() 

如果我拿出print一行,ChildWindow开放罚款。但它在我的错误:

AttributeError: 'ChildWindow' object has no attribute '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() 

我现在得到的错误:

TypeError: foo() takes 2 positional arguments but 3 were given

回答

1

ChildWindow类没有属性的世界,但你可以通过the parent()功能访问它,由于您已使用以下语句,因此返回父级:self.window_to_open = ChildWindow (self)

你必须改变

self.world.foo(1, 2) 

self.parent().world.foo(1, 2) 

你的方法必须被声明为静态的,因为它不使用自身作为参数。

class World: 
    def __init__(self): 
     # stuff 

    @staticmethod 
    def foo(a, b): 
     c = a + b # trivial example 
     return c 

def foo(self, a, b): 
    c = a + b # trivial example 
    return c 
+0

感谢,并感谢清理我的OP。为了保持代码的其余部分干净并防止重复,你会推荐做一些类似'self.child_world = self.parent()。world'吗?我认为最好给这个“世界”一个不同的名字,以防止它与父母的混淆。 – drewd423

+0

使用您显示的代码访问父级方法。这个父亲不是遗产之一,它是一个父亲给予消除其他元素的有效方式的记忆 – eyllanesc

+0

有些事情还是不对的。我现在得到一个新的错误,看到更新的OP。 – drewd423

相关问题