来自另一个类的PyQt访问属性

时间:2017-07-23 13:17:57

标签: python python-2.7 class variables pyqt

我无法从另一个(user_register_window)修改第一个类(login_window)的属性...我的代码如下:

class login_window(QtGui.QWidget, Ui_login_form):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)
        self.register_window = None
        self.login_btn.clicked.connect(self.login_func)
        self.register_btn.clicked.connect(self.register_func)
        usernames_list = c.execute("SELECT USERNAME FROM register_table").fetchall()
        for data in usernames_list:
            self.username_combo_field.addItems(data)
   def register_func(self):
        if self.register_window is None:
            self.register_window = user_register_window(self)
            self.register_btn.setEnabled(False)
            self.login_btn.setEnabled(False)
        self.register_window.show()



class user_register_window(QtGui.QDialog, Ui_register_form):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.CustomizeWindowHint)
        self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowContextHelpButtonHint)
        self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowCloseButtonHint)
        self.cancel_btn.clicked.connect(self.cancel_pressed)

    def cancel_pressed(self):
        user_register_window.close(self)
        login_window.login_btn.setEnabled(True)  #doesn't work

我的login_window首先运行,所以当我点击register_btn时," user_register_window"出现,在login_window中禁用了register_btn和login_btn。到目前为止一切正常,我的问题是当我关闭" user_register_window"。当我按下cancel_btn时,我想再次启用" register_btn"和" login_btn"。

我尝试使用以下代码:

login_window.login_btn.setEnabled(True)

在cancel_pressed函数中,但它不起作用。

AttributeError: type object 'login_window' has no attribute 'login_btn'

有办法吗?

非常感谢你的帮助!!!

1 个答案:

答案 0 :(得分:1)

调用login_window.login_btn.setEnabled(True)无法访问该属性,因为您引用了类,而不是实例(并且该属性仅在实例上设置,在构造函数内)。

您可以使用父链接从第二个访问实例login_window,因为您已将第二个声明为子窗口小部件(使用self.register_window = user_register_window(self)),您可以使用以下行来实现这个:

self.parent().login_btn.setEnabled(True)
self.parent().register_btn.setEnabled(False)

#and it's better to close the widget with : 
self.close()