Я пытаюсь сделать приложение, но я продолжаю получать пробитые «простые» вещи, подобные этому, как открыть новое окно, нажав кнопку? Я попытался с помощью 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 помощи.
Я исправил двойной вызов self.newLib() и заменил простой run() для If __name __... но я действительно не получил другую часть, я имею в виду, должен ли я создать такую функцию, как тот, который вы публикуете для окна тоже? потому что я попробовал это, но я не знал, как и где назвать это в коде, поэтому я не знал, должен ли я сделать это для окна, я пытался, но у меня были только ошибки, поэтому я позволил себе .show() там, чтобы попытаться использовать create_new_library_window() в кнопке, но снова я получил сообщение об ошибке, в котором говорилось, что в окне не было атрибута create _..., извините, я noob, мог бы снова объяснить? –
'create_new_library_window' является неполным. Он нуждается в аргументе 'self' и должен быть методом класса' Window'. Также необходимо сохранить ссылку на 'new_lib', иначе новое окно будет просто собираться с помощью мусора, когда возвращается метод (т. Е.' Self.new_lib = newlib.NewLibrary(); self.new_lib.show() '). – ekhumoro
@ekhumoro делает хорошие баллы. Я отредактировал свой ответ, чтобы попытаться устранить эти недостатки и добавил рабочий пример, чтобы попытаться точно объяснить, где находятся все функции. – JCVanHamme