I think there are several issues with the code that you've posted. First, there are two calls to self.newLib()
in the NewLibrary
constructor. Second, you probably want to put that call to runNewLib()
at the bottom of newlib.py
behind an if __name__...
block, like so:
if __name__ == '__main__':
runNewLib()
Otherwise, every time you try to import newlib.py
, it will attempt to run NewLibrary as a separate application.
Getting to the question you asked, I don't think you actually want to call self.show()
in either Window.home()
or NewLibrary.newLib()
. A more typical pattern would be to create an instance of either Window
or NewLibrary
and then call show()
on that instance. So, in your Window
class, you'd add a function to create an instance of NewLibrary
and then call show on it, like this
def create_new_library_window(self):
self.new_lib = newlib.NewLibrary()
self.new_lib.show()
Note that, as ekhumoro points out, you have to keep a reference to new_lib around, otherwise it will get garbage collected when the function exits. Then in NewLibrary.home()
after you've created the new_lib_btn
connect it to this new function:
new_lib_btn.clicked.connect(self.create_new_library_window)
Working example
This example creates a main window with one big button that, when clicked will open a second window. It uses two classes that inherit from QMainWindow, as in your question. First, in main.py
:
from PyQt4 import QtGui
from new_window import NewWindow
class Window(QtGui.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self._new_window = None
self._button = QtGui.QPushButton('New Window', self)
self._button.clicked.connect(self.create_new_window)
self.setCentralWidget(self._button)
def create_new_window(self):
self._new_window = NewWindow()
self._new_window.show()
if __name__ == '__main__':
app = QtGui.QApplication([])
gui = Window()
gui.show()
app.exec_()
The __init__
function creates a button and connects it to the create_new_window
function. When the button is clicked, create_new_window
will be called. Inside of create_new_window
, we create an instance of NewWindow
and assign it to a class member to maintain a reference to the window and prevent it from being garbage collected. We then call show
on this new window to display it.
At the bottom, we use the usual if __name__ == '__main__':
pattern to control whether this file runs the application or not. If this file is executed from the command line (like python main.py
) __name__ == '__main__'
evaluates to true and the GUI application will be started. This has the advantage of allowing the file to serve a dual purpose: it can be imported as a standard python package, or executed as an application, all using the same file.
Then in new_window.py
:
from PyQt4 import QtGui
class NewWindow(QtGui.QMainWindow):
def __init__(self):
super(NewWindow, self).__init__()
self._new_window = None
self._label = QtGui.QLabel('Hello, is it me you're looking for?')
self.setCentralWidget(self._label)
if __name__ == '__main__':
app = QtGui.QApplication([])
gui = NewWindow()
gui.show()
app.exec_()
This file defines a second QMainWindow that uses a label as its central widget. It also uses the __name__ == '__main__'
pattern; this file can also be executed as a standalone application or imported as in main.py
above.