2017-04-07 33 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

相關問題