Как обновить или перезапустить весь код?
Я хочу перейти на другое окно после нажатия кнопки. Желательно в том же окне но уже без старого содержимого
import sys
from PyQt5 import QtWidgets
class Window1(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)
self.setStyleSheet("background:red;")
class Window2(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)
self.setStyleSheet("background:blue;")
self.but = QtWidgets.QPushButton(self)
self.but.setText("Click me")
self.but.clicked.connect(self.run)
def run(self):
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Window1()
w.show()
sys.exit(app.exec_())
#self.close()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Window2()
w.show()
sys.exit(app.exec_())
Я знаю что могу просто
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
win1 = Window1(self)
win2 = Window2(self)
win2.hide()
Но я не хочу загружать свой компьютер лишним кодом и процессами
Ответы (2 шт):
Попробуйте так:
import sys
from PyQt5 import QtWidgets
class Window1(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(300, 300)
self.setStyleSheet("background: red;")
class Window2(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)
self.setStyleSheet("background: blue;")
self.but = QtWidgets.QPushButton(self)
self.but.setText("Click me")
self.but.clicked.connect(self.close) # - run)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
print(f"app: {app}, \ninstance: {QtWidgets.QApplication.instance()}")
w = Window2()
w.show()
app.exit(app.exec())
app2 = QtWidgets.QApplication(sys.argv)
print(f"\napp2: {app2}, \ninstance: {QtWidgets.QApplication.instance()}")
w = Window1()
w.show()
app2.exit(app2.exec())
Update
В таком случае второе окно появится вне зависимоти от того нажал я на кнопку или просто закрыл окно. Мне нужно переключатся между двумя объектами. а не устанавливать очередь на открытие окон
Sorry, я как обычно плохо понимаю, что вы хотите сделать. Попробуйте так:
import sys
from PyQt5 import QtWidgets
class Window1(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(300, 300)
self.setStyleSheet("background: red;")
class Window2(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)
self.setStyleSheet("background: blue;")
self.but = QtWidgets.QPushButton(self)
self.but.setText("Click me")
self.but.clicked.connect(self._close) # - run)
self.flag_close = None
def _close(self):
self.flag_close = True
self.close()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
print(f"app: {app}, \ninstance: {QtWidgets.QApplication.instance()}")
w = Window2()
w.show()
app.exit(app.exec())
if w.flag_close:
app2 = QtWidgets.QApplication(sys.argv)
print(f"\napp2: {app2}, \ninstance: {QtWidgets.QApplication.instance()}")
w = Window1()
w.show()
app2.exit(app2.exec())
Update 2
Вы можете как эксперт проверить мой вариант?
я честно не понимаю, что вы хотите сделать и не понимаю логику примера, который вы предложили в ответе для анализа. Вот вам еще один вариант (последний), просто попробуйте понажимать на кнопки. Может это то, что вам надо.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QHBoxLayout
from PyQt5.QtCore import Qt
class App(QWidget):
def __init__(self):
super().__init__()
self.count_pages = 0
self.pages_grid_list = []
self.h_layout = None
self.initUI()
def initUI(self):
count = 0
for count_pages in range(0, 2):
widget = QWidget()
widget.setStyleSheet("background: blue;" if count_pages==0 else "background: red;")
grid_layout = QGridLayout(widget)
for x in range(0, 4):
for y in range(0, 4):
count = count + 1
button = QPushButton(str(count))
button.setFixedSize(50, 50)
button.setStyleSheet("background: #ccc;" )
button.clicked.connect(self.get_btn_clicked)
grid_layout.addWidget(button, x, y, Qt.AlignCenter)
self.pages_grid_list.append(widget)
next_page_button = QPushButton('next')
next_page_button.clicked.connect(self.next_page_action)
previous_page_button = QPushButton('previous')
previous_page_button.clicked.connect(self.previous_page_action)
self.h_layout = QHBoxLayout(self)
self.h_layout.addWidget(previous_page_button, 1, alignment=Qt.AlignHCenter)
self.h_layout.addWidget(self.pages_grid_list[self.count_pages]) # +++
self.h_layout.addWidget(next_page_button, 1, alignment=Qt.AlignHCenter)
def get_btn_clicked(self):
button = self.sender()
print('вы кликнули: {}'.format(button.text()))
def next_page_action(self):
self.count_pages = self.count_pages + 1
if self.count_pages < len(self.pages_grid_list):
self.new_page(self.count_pages)
else:
self.count_pages = len(self.pages_grid_list) - 1
def previous_page_action(self):
self.count_pages = self.count_pages - 1
if self.count_pages >= 0:
self.new_page(self.count_pages)
else:
self.count_pages = 0
def new_page(self, count_pages):
widget = self.h_layout.takeAt(1).widget()
widget.hide()
self.h_layout.insertWidget(1, self.pages_grid_list[count_pages])
self.pages_grid_list[count_pages].show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
ex.show()
sys.exit(app.exec_())
Я создал свой вариант правда я не знаю насколько мой вариант бьет по производительности если кто разбирается лучше может мне сказать
import sys
from PyQt5 import QtWidgets
class Window1(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window1, self).__init__(parent)
self.setFixedWidth(300)
self.setFixedHeight(300)
self.lay = QtWidgets.QVBoxLayout(self)
self.main = QtWidgets.QWidget(self)
self.lay.addWidget(self.main)
self.main.setStyleSheet("background: red;")
class Window2(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window2, self).__init__(parent)
self.setFixedWidth(500)
self.setFixedHeight(500)
self.lay = QtWidgets.QVBoxLayout(self)
self.main = QtWidgets.QWidget(self)
self.lay.addWidget(self.main)
self.main.setStyleSheet("background: blue;")
self.but = QtWidgets.QPushButton(self)
self.but.setText("Click me")
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.lay = QtWidgets.QVBoxLayout(self)
self.w = Window2(self)
self.lay.addWidget(self.w)
self.w.but.clicked.connect(self.close)
self.but2 = QtWidgets.QPushButton(self)
self.but2.setText("Click me2")
self.but2.move(100,100)
self.but2.clicked.connect(self.close)
def close(self):
print(self.w.but.text())
#self.but2.setParent(None)
self.w.deleteLater()
self.w = None
self.w = Window1(self)
self.lay.addWidget(self.w)
self.update()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
app.exit(app.exec())
Я понял как проверить код на производительность правда не уверен насколько.
import sys
from PyQt5 import QtWidgets
class Window1(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window1, self).__init__(parent)
self.setFixedWidth(300)
self.setFixedHeight(300)
self.lay = QtWidgets.QVBoxLayout(self)
self.main = QtWidgets.QWidget(self)
self.lay.addWidget(self.main)
self.main.setStyleSheet("background: red;")
class Window2(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window2, self).__init__(parent)
self.setFixedWidth(500)
self.setFixedHeight(500)
self.lay = QtWidgets.QVBoxLayout(self)
self.main = QtWidgets.QWidget(self)
self.lay.addWidget(self.main)
self.main.setStyleSheet("background: blue;")
self.but = QtWidgets.QPushButton(self)
self.but.setText("Click me")
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.lay = QtWidgets.QVBoxLayout(self)
self.w = Window2(self)
self.lay.addWidget(self.w)
self.w.but.clicked.connect(self.close)
# проверка на производительность
self.but2 = QtWidgets.QPushButton(self)
self.but2.setText("Click me 2")
self.but2.move(0,100)
self.but2.clicked.connect(self.add)
self.but3 = QtWidgets.QPushButton(self)
self.but3.setText("Click me 3")
self.but3.move(0,50)
self.but3.clicked.connect(self.add2)
self.num = 0
def add2(self):
print("Click me 3-{}".format(self.num))
self.num += 1
s = 0
while s < 10000 :
s += 1
self.but = QtWidgets.QPushButton(self)
self.but.setText("Click me"+str(s))
self.w.lay.addWidget(self.but)
self.but.hide()
def add(self):
print("Click me 2-{}".format(self.num))
self.num += 1
s = 0
while s < 10000 :
s += 1
self.but = QtWidgets.QPushButton(self)
self.but.setText("Click me"+str(s))
self.w.lay.addWidget(self.but)
self.but.deleteLater()
self.but.setParent(None)
self.but = None
def close(self):
print(self.w.but.text())
self.w.deleteLater()
self.w.setParent(None)
self.w = None
self.w = Window1(self)
self.lay.addWidget(self.w)
self.update()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
app.exit(app.exec())
Начальные параметры
Если нажать на Click me 2 десять раз
Если нажать на Click me 3 десять раз




