Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 21.04.2017
Сообщений: 39
PyQt5

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

25.10.2018, 11:55. Показов 4393. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru