Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/75: Рейтинг темы: голосов - 75, средняя оценка - 4.92
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
PyQt5

Проблема с созданием нескольких элементов (кнопок) в цикле

26.09.2020, 08:04. Показов 16100. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имею задачу:
Разместите на форме кнопки с латинскими буквами, а так же поле для ввода. При нажатии на кнопку добавляйте в поле код этой буквы из азбуки Морзе. Не создавайте каждую кнопку вручную, воспользуйтесь циклом.

Нигде не нашел информации или примера, как все это можно провернуть, вот мой код:
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
import sys
from itertools import cycle
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QHBoxLayout, QPushButton, QVBoxLayout
from PyQt5.uic.properties import QtCore
 
MORSE_CODE_DICT = {'A': '.-', 'B': '-...',
 
                   'C': '-.-.', 'D': '-..', 'E': '.',
 
                   'F': '..-.', 'G': '--.', 'H': '....',
 
                   'I': '..', 'J': '.---', 'K': '-.-',
 
                   'L': '.-..', 'M': '--', 'N': '-.',
 
                   'O': '---', 'P': '.--.', 'Q': '--.-',
 
                   'R': '.-.', 'S': '...', 'T': '-',
 
                   'U': '..-', 'V': '...-', 'W': '.--',
 
                   'X': '-..-', 'Y': '-.--', 'Z': '--..'}
 
 
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
 
    def initUI(self):
        self.main_layout = QHBoxLayout(self)
        self.input_layout = QVBoxLayout(self)
        self.out_layot = QVBoxLayout(self)
        self.setWindowTitle('Морзе')
 
        for k, v in MORSE_CODE_DICT.items():
            self.btn = QPushButton(k, self)
            text = self.line1.text()
            self.btn.clicked.connect(lambda self.line1, v: Example.line1.setText(Example.line1.text() + v))
            self.main_layout.addWidget(self.btn)
 
        self.line1 = QLineEdit(self)
 
        self.setLayout(self.main_layout)
 
    def plus(self, mors):
        text = self.line1.text()
        self.line1.setText(text + mors)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec())
я пробовал и через обычную функцию, пытаясь ей передавать значения из словаря, но также вылезала ошибка...
Есть идеи?
Миниатюры
Проблема с созданием нескольких элементов (кнопок) в цикле  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.09.2020, 08:04
Ответы с готовыми решениями:

Проблема с созданием потоков в цикле
Задача состоит в том, чтобы посчитать ряд. У меня есть цикл, в котором я создаю потоки, каждый из которых считает свою часть ряда. Первый...

Обработка нажатия нескольких кнопок, созданных в цикле
Есть форма с вкладками, в первой вкладке находится DataGridView, (номер, компонент, массовая доля, расход), при нажатии на кнопку...

Добавление нескольких элементов в цикле
Всем здарова. Такая тема - есть цикл на PHP, в котором дергаются данные из базы (координаты), далее в этом же цикле засунут ява скрипт код,...

7
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
26.09.2020, 08:08  [ТС]
Хотя проблема даже не в том, что я не могу создать кнопки в цикле, а в том, что я не знаю, как привязать к каждой кнопке соответствующие ей действие.
0
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
26.09.2020, 08:32  [ТС]
Теперь я запутался еще и с размещением.
Я делю алфавит на две строки, каждую выравниваю по ширине, а затем добавляю их в выравниватель по высоте, и на выхлопе получаю дичь.

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
import sys
from itertools import cycle
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QHBoxLayout, QPushButton, QVBoxLayout
from PyQt5.uic.properties import QtCore
 
MORSE_CODE_DICT = {'A': '.-', 'B': '-...',
 
                   'C': '-.-.', 'D': '-..', 'E': '.',
 
                   'F': '..-.', 'G': '--.', 'H': '....',
 
                   'I': '..', 'J': '.---', 'K': '-.-',
 
                   'L': '.-..', 'M': '--', 'N': '-.',
 
                   'O': '---', 'P': '.--.', 'Q': '--.-',
 
                   'R': '.-.', 'S': '...', 'T': '-',
 
                   'U': '..-', 'V': '...-', 'W': '.--',
 
                   'X': '-..-', 'Y': '-.--', 'Z': '--..'}
 
 
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
 
    def initUI(self):
        self.first_layout = QHBoxLayout(self)
        self.second_layout = QHBoxLayout(self)
        self.input_layout = QHBoxLayout(self)
        self.main_layout = QVBoxLayout(self)
        self.setWindowTitle('Арифмометр')
 
        i = 0
        for k, v in MORSE_CODE_DICT.items():
            i += 1
            self.btn = QPushButton(k, self)
            '''text = self.line1.text()'''
            '''self.btn.clicked.connect(lambda self.line1, v: Example.line1.setText(Example.line1.text() + v))'''
            if i <= 15:
                self.first_layout.addWidget(self.btn)
            else:
                self.second_layout.addWidget(self.btn)
 
        self.line = QLineEdit(self)
 
        self.input_layout.addWidget(self.line)
        self.main_layout.addLayout(self.first_layout)
        self.main_layout.addLayout(self.second_layout)
        self.main_layout.addLayout(self.input_layout)
        self.setLayout(self.main_layout)
 
    def plus(self, mors):
        text = self.line1.text()
        self.line1.setText(text + mors)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec())
Миниатюры
Проблема с созданием нескольких элементов (кнопок) в цикле  
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
26.09.2020, 09:29
Лучший ответ Сообщение было отмечено billy121 как решение

Решение

По размещению - уберите self из строк типа "n = QHBoxLayout(self) ".

По кнопкам - напишите для кнопки свой отдельный класс с атрибутами name и value, где name - это то, что на ней написано, value - знак Морзе. И определите генерацию сигнала по нажатию с передачей value наружу. А в классе основного окна этот сигнал ловите и выводите value в line.
2
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
26.09.2020, 10:57  [ТС]
Lekks,
Цитата Сообщение от Lekks Посмотреть сообщение
По размещению - уберите self из строк типа "n = QHBoxLayout(self) ".
Оооо, это сработало.
Спасибо за совет и идею, пойду пробовать)

Добавлено через 1 час 17 минут
Lekks, наткнулся на метод sender(), который дает возможность определять откуда сигнал, и все получилось)
1
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
26.09.2020, 10:59
Цитата Сообщение от billy121 Посмотреть сообщение
и все получилось)
Молодец )))
2
7 / 7 / 0
Регистрация: 04.12.2020
Сообщений: 40
28.09.2021, 23:08
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
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QCheckBox, QLineEdit, QPushButton
 
MORSE_CODE_DICT = {'A': '.-', 'B': '-...',
 
                   'C': '-.-.', 'D': '-..', 'E': '.',
 
                   'F': '..-.', 'G': '--.', 'H': '....',
 
                   'I': '..', 'J': '.---', 'K': '-.-',
 
                   'L': '.-..', 'M': '--', 'N': '-.',
 
                   'O': '---', 'P': '.--.', 'Q': '--.-',
 
                   'R': '.-.', 'S': '...', 'T': '-',
 
                   'U': '..-', 'V': '...-', 'W': '.--',
 
                   'X': '-..-', 'Y': '-.--', 'Z': '--..'}
 
 
class Window(QWidget):
    def __init__(self):
        super().__init__()
 
        self.setGeometry(300, 200, 520, 60)
        self.setWindowTitle('Азбука Морзе 2')
 
        # вывод
        self.output = QLineEdit(self)
        self.output.move(0, 30)
        self.output.resize(520, 30)
        self.output.setEnabled(False)
        b = 0
 
        # создаем кнопки
        for k, v in MORSE_CODE_DICT.items():
            self.btn = QPushButton(self)
            self.btn.setText(k)
            self.btn.resize(20, 20)
            self.btn.move(b, 0)
            b = b + 20
            self.btn.clicked.connect(self.run)
 
    def run(self):
        #print('f')
        self.output.setText(self.sender().text(MORSE_CODE_DICT[self.sender()]))
        #print(self.sender().text())
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec())
Здравствуйте, помогите организовать вывод, пожалуйста. Никак не получается.
0
7 / 7 / 0
Регистрация: 04.12.2020
Сообщений: 40
29.09.2021, 19:25
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
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QCheckBox, QLineEdit, QPushButton
 
MORSE_CODE_DICT = {'A': '.-', 'B': '-...',
 
                   'C': '-.-.', 'D': '-..', 'E': '.',
 
                   'F': '..-.', 'G': '--.', 'H': '....',
 
                   'I': '..', 'J': '.---', 'K': '-.-',
 
                   'L': '.-..', 'M': '--', 'N': '-.',
 
                   'O': '---', 'P': '.--.', 'Q': '--.-',
 
                   'R': '.-.', 'S': '...', 'T': '-',
 
                   'U': '..-', 'V': '...-', 'W': '.--',
 
                   'X': '-..-', 'Y': '-.--', 'Z': '--..'}
 
 
class Window(QWidget):
    def __init__(self):
        super().__init__()
 
        self.setGeometry(300, 200, 520, 60)
        self.setWindowTitle('Азбука Морзе 2')
 
        # вывод
        self.output = QLineEdit(self)
        self.output.move(0, 30)
        self.output.resize(520, 30)
        self.output.setEnabled(False)
        b = 0
 
        # создаем кнопки
        for k, v in MORSE_CODE_DICT.items():
            self.btn = QPushButton(self)
            self.btn.setText(k)
            self.btn.resize(20, 20)
            self.btn.move(b, 0)
            b = b + 20
            self.btn.clicked.connect(self.run)
 
    def run(self):
        s = MORSE_CODE_DICT[self.sender().text()]
        print(s)
        d = self.output.text()
        self.output.setText(f"{d} {s}")
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec())
решение
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2021, 19:25
Помогаю со студенческими работами здесь

Проблема с задачей с созданием очереди из элементов первого стека которых нет во втором
Здравствуйте, я в процессе изучения С++ получил подобную задачу. &quot;Даны два стека целых чисел от 0 до 1000. Из элементов пеpвого стека,...

Изменение свойств нескольких элементов в цикле
Всем доброго времени суток. Кто может подсказать, как можно в цикле поменять однои то же свойство нескольким элементам. Код просто на...

Игра с динамическим созданием кнопок. Выдает ошибку
Всем привет. Пишу небольшую игрушку. Суть вот в чем: есть несколько уровней сложности (легкий, сложный, очень сложный, непроходимый)....

Как организовать задержку между созданием динамических кнопок?
Здравствуйте! Я новичок в C++ Прошу подсказать как можно организовать задержку 1 сек между появлением на форме динамических кнопок с 1...

В экземпляре не задана ссылка на объект при работе с динамическим созданием кнопок
Народ выдаёт ошибку- Дополнительные сведения: В экземпляре объекта не задана ссылка на объект. Не могу понять в чем ошибся. namespace...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru