0 / 0 / 0
Регистрация: 21.04.2017
Сообщений: 39
PyQt5

Изменение содержимого в MainWindow

25.10.2018, 11:55. Показов 4416. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Делаю программку (и на ней же учусь) для школы. Есть задача сделать полноценное приложения для обучения немецкому языку. Есть старое на делфях (но так как файлов проекта попросту нет, то приходится пилить новое)

Мне необходимо сделать так, чтобы при нажатии на одну из кнопок (5, 6, 7, 8, 9 классы) открывалось другое содержимое, но при необходимости я мог вернуться назад, так скажем на "главную".

Подскажите где что читать, что изучить, или покажите кусочек кода как это можно реализовать.

Заранее благодарен. Надеюсь объяснил доходчиво.

Про кнопку "Спасибо" и "Лучший ответ" не забываю.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, qApp, QLabel, QAction, QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QCoreApplication
 
 
 
class MWinodow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
 
 
    def initUI(self):
        self.statusBar().showMessage('Ready')
    #Устанавливаем иконку (пока что от балды)
        self.setFixedSize(650, 500)
        self.setWindowTitle('GoGoDeutsch')
        self.setWindowIcon(QIcon('web.png'))
 
 
        qbtn = QPushButton("Выход", self) #Кнопка выхода
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(310, 420)
 
 
        btn_klasse_6 = QPushButton("5 klasse", self)  #5 класс
        btn_klasse_6.resize(btn_klasse_6.sizeHint())
        btn_klasse_6.move(500, 40)
        
 
        btn_klasse_5 = QPushButton("6 klasse", self)  #6 класс
        btn_klasse_5.resize(btn_klasse_5.sizeHint())
        btn_klasse_5.move(500, 80)
 
        btn_klasse_7 = QPushButton("7 klasse", self)  #7 класс
        btn_klasse_7.resize(btn_klasse_7.sizeHint())
        btn_klasse_7.move(500, 120)
 
        btn_klasse_8 = QPushButton("8 klasse", self) #8 класс
        btn_klasse_8.resize(btn_klasse_8.sizeHint())
        btn_klasse_8.move(500, 160)
 
        btn_klasse_9 = QPushButton("9 klasse", self) #9 класс
        btn_klasse_9.resize(btn_klasse_9.sizeHint())
        btn_klasse_9.move(500, 200)
 
        # Верхнее меню
        exitAction = QAction(QIcon('exit.png'), '&Выход', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Выйти из приложения')
        exitAction.triggered.connect(qApp.quit)
        self.statusBar()
 
        self.toolbar = self.addToolBar("Выход")
        self.toolbar.addAction(exitAction)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('GoGoDeutsch')
 
 
        self.show() 
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MWinodow()
    sys.exit(app.exec_())
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.10.2018, 11:55
Ответы с готовыми решениями:

Проверка на изменение содержимого файла
Здравствуйте. Такая проблема. У пользователя есть возможность открыть текстовый файл, нажав кнопку. Он может что-то добавить в этот файл...

Изменение label при изменение содержимого textBox
Здравствуйте! Делаю курсовой проект и решил добавить форму регистрации. Надо чтобы при изменении содержимого текстбокса, на форме появлялся...

Связать переменные из mainwindow.h и mainwindow.cpp
Здравствуйте! Подскажите, пожалуйста: В файле mainwindow.cpp есть некоторая переменная state (переменная состояния), которой...

7
0 / 0 / 0
Регистрация: 21.04.2017
Сообщений: 39
26.10.2018, 14:15  [ТС]
В коде ниже я подшаманил, и получилось следующее:

Python
1
2
3
4
5
def connect_5kl(self):
        self.window = QWidget()
        self.setGeometry(100, 210, 300, 210)
        self.setWindowTitle('GoGoDeutsch 5 klasse Tests')
        self.show()
Здесь как я понимаю наследуются все свойства MWindow, но при нажатии на кнопку окно ведет себя точно так же, НО: меняет координаты (т.к. я их поменял), и меняет заголовок окна,
Python
1
self.show
как я понимаю вообще не нужно здесь.

По итогу оно как - то работает, но нового окна не открывает (помогите найти истину, очень прошу)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, qApp, QWidget, QAction, QMdiSubWindow
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QCoreApplication
 
 
 
class MWinodow(QMainWindow):
    def __init__(self):
        super(MWinodow, self).__init__()
 
        self.statusBar().showMessage('Bereit')
        self.setFixedSize(650, 500)
        self.setWindowTitle('GoGoDeutsch')
        self.setWindowIcon(QIcon('web.png'))#Устанавливаем иконку
 
        qbtn = QPushButton("Выход", self) #Кнопка выхода
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(310, 420)
 
 
        btn_klasse_6 = QPushButton("5 klasse", self)  #5 класс
        btn_klasse_6.resize(btn_klasse_6.sizeHint())
        btn_klasse_6.move(500, 40)
        btn_klasse_6.clicked.connect(self.connect_5kl)
 
        btn_klasse_5 = QPushButton("6 klasse", self)  #6 класс
        btn_klasse_5.resize(btn_klasse_5.sizeHint())
        btn_klasse_5.move(500, 80)
 
        btn_klasse_7 = QPushButton("7 klasse", self)  #7 класс
        btn_klasse_7.resize(btn_klasse_7.sizeHint())
        btn_klasse_7.move(500, 120)
 
        btn_klasse_8 = QPushButton("8 klasse", self) #8 класс
        btn_klasse_8.resize(btn_klasse_8.sizeHint())
        btn_klasse_8.move(500, 160)
 
        btn_klasse_9 = QPushButton("9 klasse", self) #9 класс
        btn_klasse_9.resize(btn_klasse_9.sizeHint())
        btn_klasse_9.move(500, 200)
 
        exitAction = QAction(QIcon('exit.png'), '&Выход', self) # Верхнее меню
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Выйти из приложения')
        exitAction.triggered.connect(qApp.quit)
        self.statusBar()
 
        self.toolbar = self.addToolBar("Выход")
        self.toolbar.addAction(exitAction)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('GoGoDeutsch')
        self.show() #метод отображения того, что мы наделали (то есть он пишется самым последним)
 
 
    def connect_5kl(self):
        self.window = QWidget()
        self.setGeometry(100, 210, 300, 210)
        self.setWindowTitle('GoGoDeutsch 5 klasse Tests')
        self.show()
 
 
 
 
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MWinodow()
sys.exit(app.exec_())
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
26.10.2018, 14:45
ЕЯПП
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from PyQt5 import Qt 
 
class W(Qt.QWidget):
    def __init__(self):
        super().__init__()
        self.pix = Qt.QPixmap(600,400)
        self.pix.fill(Qt.Qt.black)
        self.label = Qt.QLabel()
        self.label.setPixmap(self.pix)
        self.box = Qt.QComboBox()
        self.box.addItems(['black','red','green','blue'])
        self.box.currentIndexChanged.connect(self.on_box)
        grid = Qt.QGridLayout(self)
        grid.addWidget(self.label)
        grid.addWidget(self.box)
        
    def on_box(self):
        color = 'Qt.Qt.' + self.box.currentText()
        self.pix.fill(eval(color))
        self.label.setPixmap(self.pix)
 
if __name__=="__main__":
    app = Qt.QApplication([])
    w = W()
    w.show()
    app.exec_()
Добавлено через 6 минут
если хотите на QMainWindow делать посмотрите здесь
https://github.com/baoboa/pyqt... ainwindows
1
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
26.10.2018, 15:13
Можно попробовать весь QWidget подменить и затем вернуть
1
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
26.10.2018, 16:46
Лучший ответ Сообщение было отмечено Kanopu как решение

Решение

есть QTabWidget, QStackedWidget, там состояние сохраняется при переключении
код у ТС так себе, в MainWindow кнопки не нужны, там все через меню делается

Добавлено через 1 час 8 минут
для примера - StackedWidget
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from PyQt5 import Qt
 
class W(Qt.QWidget):
    def __init__(self):
        super().__init__()
        self.w = Qt.QStackedWidget()
        self.w.addWidget(Qt.QPlainTextEdit())
        self.w.addWidget(Qt.QLabel('<font color=red>111<br>222</font>'))
        self.w.addWidget(Qt.QLabel('<b>333</b>'))
        self.w.addWidget(Qt.QLabel('<font color = green><i>444</i></font>'))
        grid = Qt.QGridLayout(self)
        grid.setContentsMargins(1,1,1,1)
        self.btnNext = Qt.QPushButton('Next')
        self.btnNext.clicked.connect(self.on_next)
        grid.addWidget(self.w,0,0,10,10)
        grid.addWidget(self.btnNext,10,0,1,1)
        
    def on_next(self):
        idx = (self.w.currentIndex() + 1) % len(self.w)
        self.w.setCurrentIndex(idx)
 
if __name__=="__main__":
    app = Qt.QApplication([])
    w = W()
    w.show()
    app.exec_()
1
0 / 0 / 0
Регистрация: 21.04.2017
Сообщений: 39
31.10.2018, 14:22  [ТС]
vic5710, А если юзануть просто QWidget? тогда получается из кода нужно будет убрать верхнее меню и прочее, что позволяет юзать QMainWindow?

Добавлено через 4 минуты
vic5710, Сделал что - то подобное на это (код ниже)

Python
1
2
3
4
    def connect_5kl(QWidget):
        QWidget.setGeometry(100, 210, 300, 210)
        QWidget.setWindowTitle('GoGoDeutsch 5 klasse Tests')
        QWidget.show()
На это кнопка "5 класс" реагирует, но вполне законно меняет положение окна, и его заголовок. Но как мне сделать чтобы все же открывалось новое окно поверх этого?


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, qApp, QWidget, QAction
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QCoreApplication
 
 
 
class MWinodow(QWidget):
    def __init__(self):
        super(MWinodow, self).__init__()
 
 
        self.setFixedSize(650, 500)
        self.setWindowTitle('GoGoDeutsch')
        self.setWindowIcon(QIcon('web.png'))#Устанавливаем иконку
 
        qbtn = QPushButton("Ausgang", self) #Кнопка выхода
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(310, 420)
 
 
        btn_klasse_6 = QPushButton("Klasse 5", self)  #5 класс
        btn_klasse_6.resize(btn_klasse_6.sizeHint())
        btn_klasse_6.move(500, 40)
        btn_klasse_6.clicked.connect(self.connect_5kl)
 
        btn_klasse_5 = QPushButton("Klasse 6", self)  #6 класс
        btn_klasse_5.resize(btn_klasse_5.sizeHint())
        btn_klasse_5.move(500, 80)
 
        btn_klasse_7 = QPushButton("7 klasse", self)  #7 класс
        btn_klasse_7.resize(btn_klasse_7.sizeHint())
        btn_klasse_7.move(500, 120)
 
        btn_klasse_8 = QPushButton("8 klasse", self) #8 класс
        btn_klasse_8.resize(btn_klasse_8.sizeHint())
        btn_klasse_8.move(500, 160)
 
        btn_klasse_9 = QPushButton("9 klasse", self) #9 класс
        btn_klasse_9.resize(btn_klasse_9.sizeHint())
        btn_klasse_9.move(500, 200)
 
        exitAction = QAction(QIcon('exit.png'), '&Выход', self) # Верхнее меню
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Выйти из приложения')
        exitAction.triggered.connect(qApp.quit)
 
 
 
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('GoGoDeutsch')
        self.show() #метод отображения того, что мы наделали (то есть он пишется самым последним)
 
 
    def connect_5kl(QWidget):
        QWidget.setGeometry(100, 210, 300, 210)
        QWidget.setWindowTitle('GoGoDeutsch 5 klasse Tests')
        QWidget.show()
 
 
 
 
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MWinodow()
    sys.exit(app.exec_())
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
31.10.2018, 14:53
Так вам новое окно нужно или заменить старое?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
31.10.2018, 17:25
Цитата Сообщение от Kanopu Посмотреть сообщение
Мне необходимо сделать так, чтобы при нажатии на одну из кнопок (5, 6, 7, 8, 9 классы) открывалось другое содержимое, но при необходимости я мог вернуться назад, так скажем на "главную".
этому условию отвечают QTabWidget, QStackedWidget
вы определитесь что вам нужно
погулите Прохоренок, там необходимый минимум знаний есть

Добавлено через 5 минут
Цитата Сообщение от Kanopu Посмотреть сообщение
Но как мне сделать чтобы все же открывалось новое окно поверх этого?
QDialog
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2018, 17:25
Помогаю со студенческими работами здесь

undefined reference to `mainwindow::~mainwindow()'
Не понимаю из-за чего ошибка mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &lt;QMainWindow&gt; #include...

Изменение содержимого формы
Здравствуйте. Вопрос: Как сделать в визуальной среде изменение содержимого формы? Например: Нажал кнопку1 : у тебя Memo элемент и...

Изменение содержимого файла
Добрый день! Мне пришлось изменять программу, которую писал не я. Я локализовал место в коде и знаю, чего от него хочу, но не знаю, что...

Изменение содержимого button
Мне необходимо при нажатии на кнопку менять ее содержимое, сама же кнопка просто скрывает блок. Пытаюсь изменить с помощью добавления...

Изменение содержимого webBrowser
Здравствуйте, хочу переписать свой чат с WinForms на WPF. Сообщения там подгружаются в WebBrowser методом webBrowser.Document.Write(). В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru