【发布时间】:2015-04-01 18:25:21
【问题描述】:
我正在学习 Python 中的 GUI 编程。我正在使用 Pyside 框架。为了练习,我正在开发一个简单的应用程序,用户单击打开新窗口按钮。我已经开发了简单的原型:
MainFile.py
from PySide import QtGui, QtCore
import Starter
import sys
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
starter = Starter.StartClass()
starter.show()
sys.exit(app.exec_())
Starter.py
from PySide import QtGui, QtCore
import start1_ui, pop_up
class StartClass(start1_ui.Ui_MainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.click_button.clicked.connect(self.call_method)
def call_method(self):
print 'hey! I am Starter'
pop = pop_up.PopupClass()
pop.setAttribute(QtCore.Qt.WA_DeleteOnClose)
pop.show()
pop_up.py
from PySide import QtGui, QtCore
import popup_ui
class PopupClass(popup_ui.Ui_MainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
#self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
print 'I am shown'
我已经使用 pyside-uic 将 qtDesigner 中创建的 *.ui 文件转换为 *.py。我没有放这些 py 文件,因为它们太大了。文件结构为
start1_ui.py
from PySide import QtCore, QtGui
class Ui_MainWindow(QtGui.QMainWindow):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(437, 290)
## Much more code for setting various widget attribute as width. height
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.click_button.setText(QtGui.QApplication.translate("MainWindow", "ClickMe", None, QtGui.QApplication.UnicodeUTF8))
和popup_ui.py
class Ui_MainWindow(QtGui.QMainWindow):
def setupUi(self, MainWindow):
#setting up widgets here
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Finally, I am opened", None, QtGui.QApplication.UnicodeUTF8))
现在,当我单击 starter.py 中的按钮时,新的弹出窗口会打开但会立即关闭。我尝试使用属性作为QtCore.Qt.WA_DeleteOnClose
但它没有帮助?
我错过了什么?如何打开弹出窗口并使其在上面的代码中可见?
编辑: 从 cmets 中,我们需要维护新窗口对象的引用,以便 gc 不会清理它。那么为什么我们运行代码后第一个窗口仍然保持原样?
通过将其添加到列表中以进行引用,它将创建多个窗口。我只需要创建窗口。并且 f 父窗口也被关闭然后自动关闭弹出窗口。
如何在上面的代码中使用QtCore.Qt.WA_DeleteOnClose 方法?
【问题讨论】:
-
你没有在 Python 中存储引用和垃圾收集立即再次破坏了窗口。
-
@three_pineapples,我看过这些问题,你提到过。但是在给出的答案中,可以打开多个窗口。此外,如果我关闭父窗口,即 Starter,那么 Popup 也会保持打开状态。只需要允许一个弹出窗口,当我关闭启动窗口时,打开的弹出窗口应该关闭
-
那么这可能是另一个问题。您当前的问题是由于新窗口没有父窗口时未存储对新窗口的引用引起的。如果您想要特定的亲密行为,但自己无法解决,我建议您发布一个新问题。
标签: python pyqt pyside qt-designer