在 pyqt4 中退出 window 并打开另一个的正确方法?
Proper method to exit a window and open another one in pyqt4?
我有两个 windows,(让它们命名为 X 和 Y。当 X 收到信号时,它应该自杀,运行 window Y。
我是怎么做到的:
- 尝试通过调用 exit 和东西退出 window X 并像菜鸟一样启动 window Y。 (出现分段错误并且循环已经运行宁东西)
- 尝试将同一个应用程序传递给另一个应用程序window,但仍然没有成功。
我的 X 和 Y 看起来像这样:
This is X which calls Y
from PyQt4 import QtCore, QtGui
import sqlite3,hashlib,time
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def __init__(self):
self.server = sqlite3.connect('ems.db')
self.cursor = self.server.cursor()
def dummy(self,*args):
self.close()
#close("Kallu")
def setupUi(self, MainWindow):
# A button calls dummy here
# Other boring stuff
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
#Boring
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
def close(user): #Routine for closing window
app.closeAllWindows()
app.quit()
app.exit()
import y #here i import Y
y.main(app) #Dosent works even if i pass the app as i have to run
#app again there but it'll show already running
if __name__ == "__main__":
MainWindow.show()
sys.exit(app.exec_())
This is the Y code
import time
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(746, 503)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
import sys
def main(user):
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我不需要你修改代码,而是让我了解如何做以及它为何有效?
一个程序不是一组文件,而是一组相互作用的对象,所以想法是两个 windows 在同一个地方,关闭时另一个打开。另一方面,PyQt 建议不要修改 Qt Designer 生成的 class,而是创建一个新的 class 继承适当的小部件并使用初始 class 作为界面(有关更多信息,请阅读 the docs).
x.py
from PyQt4 import QtCore, QtGui
from y import YMainWindow
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.button = QtGui.QPushButton("Close")
MainWindow.setCentralWidget(self.button)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
pass
class XMainWindow(QtGui.QMainWindow, Ui_MainWindow):
closed = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(XMainWindow, self).__init__(parent)
self.setupUi(self)
self.button.clicked.connect(self.dummy)
@QtCore.pyqtSlot()
def dummy(self):
self.closed.emit()
self.close()
import sys
def main():
app = QtGui.QApplication.instance()
if app is None:
app = QtGui.QApplication(sys.argv)
wx = XMainWindow()
wy = YMainWindow()
wx.closed.connect(wy.show)
wx.show()
return app.exec_()
if __name__ == "__main__":
sys.exit(main())
y.py
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(746, 503)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
pass
class YMainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(YMainWindow, self).__init__(parent)
self.setupUi(self)
我有两个 windows,(让它们命名为 X 和 Y。当 X 收到信号时,它应该自杀,运行 window Y。
我是怎么做到的:
- 尝试通过调用 exit 和东西退出 window X 并像菜鸟一样启动 window Y。 (出现分段错误并且循环已经运行宁东西)
- 尝试将同一个应用程序传递给另一个应用程序window,但仍然没有成功。
我的 X 和 Y 看起来像这样:
This is X which calls Y
from PyQt4 import QtCore, QtGui
import sqlite3,hashlib,time
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def __init__(self):
self.server = sqlite3.connect('ems.db')
self.cursor = self.server.cursor()
def dummy(self,*args):
self.close()
#close("Kallu")
def setupUi(self, MainWindow):
# A button calls dummy here
# Other boring stuff
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
#Boring
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
def close(user): #Routine for closing window
app.closeAllWindows()
app.quit()
app.exit()
import y #here i import Y
y.main(app) #Dosent works even if i pass the app as i have to run
#app again there but it'll show already running
if __name__ == "__main__":
MainWindow.show()
sys.exit(app.exec_())
This is the Y code
import time
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(746, 503)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
import sys
def main(user):
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我不需要你修改代码,而是让我了解如何做以及它为何有效?
一个程序不是一组文件,而是一组相互作用的对象,所以想法是两个 windows 在同一个地方,关闭时另一个打开。另一方面,PyQt 建议不要修改 Qt Designer 生成的 class,而是创建一个新的 class 继承适当的小部件并使用初始 class 作为界面(有关更多信息,请阅读 the docs).
x.py
from PyQt4 import QtCore, QtGui
from y import YMainWindow
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.button = QtGui.QPushButton("Close")
MainWindow.setCentralWidget(self.button)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
pass
class XMainWindow(QtGui.QMainWindow, Ui_MainWindow):
closed = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(XMainWindow, self).__init__(parent)
self.setupUi(self)
self.button.clicked.connect(self.dummy)
@QtCore.pyqtSlot()
def dummy(self):
self.closed.emit()
self.close()
import sys
def main():
app = QtGui.QApplication.instance()
if app is None:
app = QtGui.QApplication(sys.argv)
wx = XMainWindow()
wy = YMainWindow()
wx.closed.connect(wy.show)
wx.show()
return app.exec_()
if __name__ == "__main__":
sys.exit(main())
y.py
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(746, 503)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
pass
class YMainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(YMainWindow, self).__init__(parent)
self.setupUi(self)