2015-11-25 4 views
0

Я пытаюсь сделать приложение, но я продолжаю получать пробитые «простые» вещи, подобные этому, как открыть новое окно, нажав кнопку? Я попытался с помощью new_lib_btn.clicked.connect(newlib), newlib это файл, который содержит мое второе окно и new_lib_btn кнопка, которая должна открыть окно, это в моем главном окне вы можете увидеть здесь:Как открыть окно одним нажатием кнопки из другого окна с помощью PyQt?

mainwindow.py

from PyQt4 import QtCore, QtGui 
import newlib 
import sys 
# Main Window 

class Window (QtGui.QMainWindow): 
    def __init__(self): 
     super(Window, self).__init__() 
     centralwidget = QtGui.QWidget(self) 
     self.mainLayout = QtGui.QVBoxLayout(centralwidget) 
     self.mainLayout.setAlignment(QtCore.Qt.AlignCenter) 
     self.setCentralWidget(centralwidget) 

     self.resize(800, 600) 
     self.setWindowTitle("Virtual Library") 
     self.setStyleSheet("Window {border-image: url(lib.jpg);}") 

     # ExitOption 
     menu_action1 = QtGui.QAction("Exit", self) 
     menu_action1.setShortcut("Ctrl+Q") 
     menu_action1.setStatusTip('Exit The App') 
     menu_action1.triggered.connect(self.close_application) 

     self.statusBar() 

     # MenuBar 
     main_menu = self.menuBar() 
     file_menu = main_menu.addMenu('Options') 
     file_menu.addAction(menu_action1) 



     self.home() 

    def home(self): 
     # NewLibrary btn 
     new_lib_btn = QtGui.QPushButton("New Library", self) 
     new_lib_btn.setGeometry(QtCore.QRect(310, 180, 141, 41)) 
     new_lib_btn.setStyleSheet("color: black;") 

     # AccessLibrary btn 
     access_lib_btn = QtGui.QPushButton("Access Library", self) 
     access_lib_btn.setGeometry(QtCore.QRect(310, 250, 141, 41)) 
     access_lib_btn.setStyleSheet("color: black;") 

     # FindNewBooks btn 
     find_nbooks = QtGui.QPushButton("Find New Books*", self) 
     find_nbooks.setGeometry(QtCore.QRect(310, 320, 141, 41)) 
     find_nbooks.setStyleSheet("color: black;") 

     self.mainLayout.addWidget(new_lib_btn) 
     self.mainLayout.addWidget(access_lib_btn) 
     self.mainLayout.addWidget(find_nbooks_btn) 
     self.show() 

    def close_application(self): 
     choice = QtGui.QMessageBox.question(self, 'Exit', 
             "Close the application?", 
             QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) 
     if choice == QtGui.QMessageBox.Yes: 
      sys.exit() 
     else: 
      pass 


def run(): 
    app = QtGui.QApplication(sys.argv) 
    GUI = Window() 
    sys.exit(app.exec_()) 


run() 

И вот мое второе окно, которое я хочу открыть с new_lib_btn

newlib.py

class NewLibrary (QtGui.QMainWindow): 
    def __init__(self): 
     super(NewLibrary, self).__init__() 

     self.resize(800,600) 
     self.setWindowTitle("New Library") 
     self.setStyleSheet("NewLibrary {border-image: url(wood.jpg);}") 

     # File Options 
     file_action1 = QtGui.QAction("New Library", self) 
     file_action1.setShortcut("Ctrl+N") 
     file_action1.setStatusTip("Creates a new library") 

     file_action2 = QtGui.QAction("Exit this!", self) 
     file_action2.setShortcut("Ctrl+Q") 
     file_action2.setStatusTip("Closes The App") 
     file_action2.triggered.connect(self.close_application) 

     #File Menu 
     main_menu = self.menuBar() 
     file_menu = main_menu.addMenu("File") 
     file_menu.addAction(file_action1) 
     file_menu.addAction(file_action2) 
     self.newLib() 

     self.newLib() 

    def newLib(self): 
     centralwidget = QtGui.QWidget(self) 
     self.mainLayout = QtGui.QVBoxLayout(centralwidget) 
     self.mainLayout.setAlignment(QtCore.Qt.AlignCenter) 

     #some useful buttons in the future 

     self.setCentralWidget(centralwidget) 
     self.show() 

    def close_application(self): 
     choice = QtGui.QMessageBox.question(self, 'Exit', 
             "Close the application?", 
             QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) 
     if choice == QtGui.QMessageBox.Yes: 
      sys.exit() 
     else: 
      pass 
def runNewLib(): 
    app = QtGui.QApplication(sys.argv) 
    gui = NewLibrary() 
    sys.exit(app.exec_()) 
runNewLib() 

Я много искал об этом, но я не мог понять тех немногих, которые были близки к моей ситуации, поэтому я прошу о помощи. Кажется, это так просто, но я не понимаю: /, что Я делаю, чтобы открыть второе окно, нажав new_lib_btn? PLS помощи.

ответ

5

Я думаю, что есть несколько проблем с кодом, который вы опубликовали. Во-первых, есть два вызова self.newLib() в конструкторе NewLibrary. Во-вторых, вы, вероятно, хотите поставить этот призыв к runNewLib() в нижней части newlib.py позади if __name__... блока, например, так:

if __name__ == '__main__': 
    runNewLib() 

В противном случае, каждый раз, когда вы пытаетесь импортировать newlib.py, он будет пытаться запустить NewLibrary как отдельный заявление.

Как добраться до вопроса, который вы задали, я не думаю, что вы на самом деле хотите позвонить self.show() в Window.home() или NewLibrary.newLib(). Более типичным шаблоном было бы создание экземпляра либо Window, либо NewLibrary, а затем вызвать в этом экземпляре show(). Таким образом, в вашем Window классе, вы бы добавить функцию, чтобы создать экземпляр NewLibrary, а затем вызвать показ на нем, как этот

def create_new_library_window(self): 
    self.new_lib = newlib.NewLibrary() 
    self.new_lib.show() 

Обратите внимание, что, как ekhumoro указывает, вы должны сохранить ссылку на new_lib вокруг, иначе он будет получать мусор, когда функция выйдет. Затем в NewLibrary.home() после того как вы создали new_lib_btn подключить его к этой новой функции:

new_lib_btn.clicked.connect(self.create_new_library_window) 

Рабочий пример

Этот пример создает главное окно с одной большой кнопкой, при нажатии откроется второй окно. Он использует два класса, которые наследуют от QMainWindow, как и в вашем вопросе. Во-первых, в 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_() 

__init__ функция создает кнопку и соединяет его с функцией create_new_window. При нажатии кнопки будет вызываться create_new_window. Внутри create_new_window мы создаем экземпляр NewWindow и назначаем его члену класса для поддержания ссылки на окно и предотвращения его сбора мусора. Затем мы вызываем show в это новое окно, чтобы отобразить его.

В нижней части мы используем обычный шаблон if __name__ == '__main__':, чтобы определить, работает ли этот файл приложением или нет. Если этот файл выполняется из командной строки (например, python main.py) __name__ == '__main__' оценивает значение true, и приложение GUI будет запущено. Это имеет преимущество, позволяя файлу работать с двойной целью: его можно импортировать как стандартный пакет python или выполнить как приложение, используя один и тот же файл.

Тогда в 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_() 

Этот файл определяет вторую QMainWindow, который использует метку в качестве своего центрального виджета. Он также использует шаблон __name__ == '__main__'; этот файл также может быть выполнен как отдельное приложение или импортирован как в main.py выше.

+0

Я исправил двойной вызов self.newLib() и заменил простой run() для If __name __... но я действительно не получил другую часть, я имею в виду, должен ли я создать такую ​​функцию, как тот, который вы публикуете для окна тоже? потому что я попробовал это, но я не знал, как и где назвать это в коде, поэтому я не знал, должен ли я сделать это для окна, я пытался, но у меня были только ошибки, поэтому я позволил себе .show() там, чтобы попытаться использовать create_new_library_window() в кнопке, но снова я получил сообщение об ошибке, в котором говорилось, что в окне не было атрибута create _..., извините, я noob, мог бы снова объяснить? –

+2

'create_new_library_window' является неполным. Он нуждается в аргументе 'self' и должен быть методом класса' Window'. Также необходимо сохранить ссылку на 'new_lib', иначе новое окно будет просто собираться с помощью мусора, когда возвращается метод (т. Е.' Self.new_lib = newlib.NewLibrary(); self.new_lib.show() '). – ekhumoro

+0

@ekhumoro делает хорошие баллы. Я отредактировал свой ответ, чтобы попытаться устранить эти недостатки и добавил рабочий пример, чтобы попытаться точно объяснить, где находятся все функции. – JCVanHamme

Смежные вопросы