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

Создание сигналов от нажатия кнопок цифр, native Qt signal is not callable

30.06.2020, 23:07. Показов 7911. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, необходимо написать обыкновенный калькулятор на PyQt5. написал простенький интерфейс, сделал распознавание кнопок простых арифметических операция и вспомогательных кнопок, но возникли трудности с распознаванием кнопок цифр. При выполнении этого кода выдает следующую ошибку:
Traceback (most recent call last):
File "C:/Users/Zalman/PycharmProjects/untitled/Homework2.py", line 97, in <module>
window = Calculator() # Создаем экземпляр класса
File "C:/Users/Zalman/PycharmProjects/untitled/Homework2.py", line 32, in __init__
__mapper.mappedString().connect(self._ad d_num)
TypeError: native Qt signal is not callable

Обработка нажатий кнопок цифр должна производиться через signal mapper....
Помогите, пожалуйста
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets, QtCore
import pyqtgraph
import numpy as np
 
class Calculator(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
 
        #Разметка калькулятора, это дисплей отображения результата(display)
        #и панель кнопок(panel, состоит из grid(числа) и operations), обобщенные в менеджер vbox
        self.vbox = QtWidgets.QVBoxLayout()                 #общий
        self.display = QtWidgets.QHBoxLayout()              #дисплей
        self.grid = QtWidgets.QGridLayout()                 #кнопки цифр от 0 до 9
        self.helper = QtWidgets.QHBoxLayout()                #служебные кнопки cancel и удаления последнего добавленного символа
        self.operations = QtWidgets.QVBoxLayout()           #арифметические операции
        self.panel = QtWidgets.QHBoxLayout()                #менеджер для grid и operations
        current_num = 0
 
        __mapper = QtCore.QSignalMapper()
 
        #задание кнопок от 0 до 9
        for i in range(0, 4):
            for j in range(1, 4):
                current_button = QtWidgets.QPushButton(str(current_num))
                self.grid.addWidget(current_button, i, j)
                current_num = j + i * 3
 
                current_button.clicked.connect(__mapper.map)
                __mapper.setMapping(current_button, str(current_num))
            __mapper.mappedString().connect(self._add_num)
 
 
        # задание блока служебных кнопок cancel и удаления последнего добавленного символа
        self.btn_removelast = QtWidgets.QPushButton('<-')
        self.btn_removelast.clicked.connect(self.RemoveLastButton)
        self.btn_cancel = QtWidgets.QPushButton('Cancel')
        self.btn_cancel.clicked.connect(self.ClearButton)                   #Кнопка стирания с дисплея
        self.helper.addWidget(self.btn_removelast)
        self.helper.addWidget(self.btn_cancel)
 
        #задание операций + - * / =
        self.btn_plus = QtWidgets.QPushButton('+')
        self.btn_plus.clicked.connect(self.PlusButton)
        self.btn_minus = QtWidgets.QPushButton('-')
        self.btn_minus.clicked.connect(self.MinusButton)
        self.btn_mp = QtWidgets.QPushButton('*')
        self.btn_mp.clicked.connect(self.MpButton)
        self.btn_div = QtWidgets.QPushButton('/')
        self.btn_div.clicked.connect(self.DivButton)
        self.btn_ans = QtWidgets.QPushButton('=')
        self.btn_ans.clicked.connect(self.AnsButton)
 
        self.operations.addWidget(self.btn_ans)
        self.operations.addWidget(self.btn_plus)
        self.operations.addWidget(self.btn_minus)
        self.operations.addWidget(self.btn_mp)
        self.operations.addWidget(self.btn_div)
        self.panel.addLayout(self.grid)
        self.panel.addLayout(self.operations)
 
        #отображение интерфейса
        self.btn_display = QtWidgets.QLineEdit('')
        self.display.addWidget(self.btn_display)
        self.vbox.addLayout(self.display)
        self.vbox.addLayout(self.helper)
        self.vbox.addLayout(self.panel)
        self.setLayout(self.vbox)
 
    def ClearButton(self):
        self.btn_display.setText('')
 
    def RemoveLastButton(self):
        pass
 
    def PlusButton(self):
        self.btn_display.setText('+')
 
    def MinusButton(self):
        self.btn_display.setText('-')
 
    def MpButton(self):
        self.btn_display.setText('*')
 
    def DivButton(self):
        self.btn_display.setText('/')
 
    def AnsButton(self):
        pass
 
    def _add_num(self):
        self.ioText.insert()
 
 
app = QtWidgets.QApplication(sys.argv)
window = Calculator()   # Создаем экземпляр класса
window.setWindowTitle("Домашнаяя работа 2")
window.resize(120, 300)
window.show()         # Отображаем окно
 
sys.exit(app.exec_()) # Запускаем цикл обработки событий
Добавлено через 17 минут
UPTADE
немного переделал код, теперь запускает без краша, но сигнал попросту не работает...
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets, QtCore
import pyqtgraph
import numpy as np
 
class Calculator(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
 
        #Разметка калькулятора, это дисплей отображения результата(display)
        #и панель кнопок(panel, состоит из grid(числа) и operations), обобщенные в менеджер vbox
        self.vbox = QtWidgets.QVBoxLayout()                 #общий
        self.display = QtWidgets.QHBoxLayout()              #дисплей
        self.grid = QtWidgets.QGridLayout()                 #кнопки цифр от 0 до 9
        self.helper = QtWidgets.QHBoxLayout()                #служебные кнопки cancel и удаления последнего добавленного символа
        self.operations = QtWidgets.QVBoxLayout()           #арифметические операции
        self.panel = QtWidgets.QHBoxLayout()                #менеджер для grid и operations
        current_num = 0
 
        __mapper = QtCore.QSignalMapper()
 
        #задание кнопок от 0 до 9
        for i in range(0, 4):
            for j in range(1, 4):
                if current_num < 10:
                    current_button = QtWidgets.QPushButton(str(current_num))
                    self.grid.addWidget(current_button, i, j)
                    current_num = j + i * 3
 
                    current_button.clicked.connect(__mapper.map)
                    __mapper.setMapping(current_button, str(current_num))
            __mapper.mappedString.connect(self._add_num)
 
 
        # задание блока служебных кнопок cancel и удаления последнего добавленного символа
        self.btn_removelast = QtWidgets.QPushButton('<-')
        self.btn_removelast.clicked.connect(self.RemoveLastButton)
        self.btn_cancel = QtWidgets.QPushButton('Cancel')
        self.btn_cancel.clicked.connect(self.ClearButton)                   #Кнопка стирания с дисплея
        self.helper.addWidget(self.btn_removelast)
        self.helper.addWidget(self.btn_cancel)
 
        #задание операций + - * / =
        self.btn_plus = QtWidgets.QPushButton('+')
        self.btn_plus.clicked.connect(self.PlusButton)
        self.btn_minus = QtWidgets.QPushButton('-')
        self.btn_minus.clicked.connect(self.MinusButton)
        self.btn_mp = QtWidgets.QPushButton('*')
        self.btn_mp.clicked.connect(self.MpButton)
        self.btn_div = QtWidgets.QPushButton('/')
        self.btn_div.clicked.connect(self.DivButton)
        self.btn_ans = QtWidgets.QPushButton('=')
        self.btn_ans.clicked.connect(self.AnsButton)
 
        self.operations.addWidget(self.btn_ans)
        self.operations.addWidget(self.btn_plus)
        self.operations.addWidget(self.btn_minus)
        self.operations.addWidget(self.btn_mp)
        self.operations.addWidget(self.btn_div)
        self.panel.addLayout(self.grid)
        self.panel.addLayout(self.operations)
 
        #отображение интерфейса
        self.btn_display = QtWidgets.QLineEdit('')
        self.display.addWidget(self.btn_display)
        self.vbox.addLayout(self.display)
        self.vbox.addLayout(self.helper)
        self.vbox.addLayout(self.panel)
        self.setLayout(self.vbox)
 
    def ClearButton(self):
        self.btn_display.setText('')
 
    def RemoveLastButton(self):
        pass
 
    def PlusButton(self):
        self.btn_display.setText('+')
 
    def MinusButton(self):
        self.btn_display.setText('-')
 
    def MpButton(self):
        self.btn_display.setText('*')
 
    def DivButton(self):
        self.btn_display.setText('/')
 
    def AnsButton(self):
        pass
 
    def _add_num(self, id):
        self.ioText.insert(id)
 
 
app = QtWidgets.QApplication(sys.argv)
window = Calculator()   # Создаем экземпляр класса
window.setWindowTitle("Домашнаяя работа 2")
window.resize(120, 300)
window.show()         # Отображаем окно
 
sys.exit(app.exec_()) # Запускаем цикл обработки событий
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2020, 23:07
Ответы с готовыми решениями:

Имитация нажатия кнопок клавиатуры нажатиями кнопок в окне
Скажите,как заменить нажатие кнопок клавиатуры на нажатие кнопок в окне?

Реализовать зависимость действия кнопок от нажатия кнопок режима
Доброго времени суток! Подскажите пожалуйста, как можно решить следующую задачу: У меня имеется объект, в котором есть кнопки, работа...

Имитация нажатия кнопок клавиатуры нажатиями кнопок в окне
Скажите,как заменить нажатие кнопок клавиатуры на нажатие кнопок в окне?

3
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,762
01.07.2020, 11:02
типа так
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
import sys
from PyQt5.QtCore import QSignalMapper
from PyQt5.QtWidgets import *
 
class Window(QWidget):
 
    def __init__(self, parent = None):
        super().__init__()
        layout = QVBoxLayout(self)
        mapper = QSignalMapper(self)
        for i in range(5):
            button = QPushButton()
            button.setText("Button " + str(i))
            button.clicked.connect(mapper.map)
            mapper.setMapping(button, button.text())
            layout.addWidget(button)
        mapper.mapped[str].connect(self.on_mapped)
    
    def on_mapped(self, value):
        print ('mapped:',value)
    
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
Добавлено через 11 минут
если чисто для цифр то так
Python
1
2
3
4
5
6
7
        for i in range(5):
            button = QPushButton()
            button.setText("Button " + str(i))
            button.clicked.connect(mapper.map)
            mapper.setMapping(button, i)
            layout.addWidget(button)
        mapper.mapped[int].connect(self.on_mapped)
1
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,762
01.07.2020, 18:35
имхо вы излишне усложняете задачу
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
import sys
from PyQt5.QtCore import QSignalMapper
from PyQt5.QtWidgets import *
 
class Window(QWidget):
    def __init__(self, parent = None):
        super().__init__()
        grid = QGridLayout(self)
        mapper = QSignalMapper(self)
        btns = (('1','2','3','+'),
                ('4','5','6','-'),
                ('7','8','9','*'),
                ('0','.','=','/'),
                )
        self.line =  QLineEdit()
        self.flag = False
        grid.addWidget(self.line,0,0,1,4)
        for row in range(4):
            for col in range(4):
                button = QPushButton(btns[row][col])
                grid.addWidget(button,row + 1,col)
                button.clicked.connect(mapper.map)
                mapper.setMapping(button, button.text())
        mapper.mapped[str].connect(self.on_mapped)
    
    def on_mapped(self, val):
        if val == '=':
            self.flag = True    
            txt = self.line.text()
            if '+' in txt:
                arr = [float(i) for i in txt.split('+')]
                self.line.setText(str(arr[0]+arr[-1]))
            elif '-' in txt:
                arr = [float(i) for i in txt.split('-')]
                self.line.setText(str(arr[0] - arr[-1]))
            elif '*' in txt:
                arr = [float(i) for i in txt.split('*')]
                self.line.setText(str(arr[0] * arr[-1]))
            elif '/' in txt:
                arr = [float(i) for i in txt.split('/')]
                self.line.setText(str(arr[0] / arr[-1]))
        else:
            if self.flag:
                self.line.clear()
                self.flag = False
            self.line.setText(self.line.text() + val)
    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
Добавлено через 4 минуты
написано на коленке, но думаю идея ясна
1
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,762
03.07.2020, 12:06
в питоне есть функция eval, на ее основе можно более продвинутый калькулятор сделать
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
import sys
from PyQt5.QtCore import Qt,QSignalMapper
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPalette
 
class Window(QWidget):
    def __init__(self, parent = None):
        super().__init__()
        grid = QGridLayout(self)
        mapper = QSignalMapper(self)
        btns = (
                ('(',')','<-','CLR'),
                ('1','2','3','+'),
                ('4','5','6','-'),
                ('7','8','9','*'),
                ('0','.','=','/'),
                )
        self.line =  QLineEdit()
        self.line.setStyleSheet('background-color: #cacaca;')
        grid.addWidget(self.line,0,0,1,4)
        for row in range(5):
            for col in range(4):
                button = QPushButton(btns[row][col])
                grid.addWidget(button,row + 1,col)
                button.clicked.connect(mapper.map)
                mapper.setMapping(button, button.text())
        mapper.mapped[str].connect(self.on_mapped)
        self.errorLine = QLabel()
        grid.addWidget(self.errorLine,6,0,1,4)
    
    def on_mapped(self, val):
        if val == 'CLR':
            self.line.clear()
            return
        txt = self.line.text()
        if val == '=':
            try:
                self.line.setText(str(round(eval(txt),3)))
                self.errorLine.setText('OK')
            except Exception as e:
                self.errorLine.setText(str(e))
        elif val == '<-':
            self.line.setText(txt[:-1])
        else:
            self.line.setText(txt + val)
    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.07.2020, 12:06
Помогаю со студенческими работами здесь

Signal: Segmentation fault (11) Signal code: Address not mapped (1)
Всем доброго здоровья! Имеется параллельная программа решения алгоритма Гаусса-Зайделя. Указанная программа выпоняется на компьютере...

Имитация нажатия кнопок
День добрый подскажите а возможно ли средствами VBS имитировать нажатие кнопок к примеру при установки программы выскакивает два...

Координаты нажатия кнопок
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin IntToStr(X); ...

Нажатия кнопок мыши
коды кнопок мыши 1, 2, 4.....но не работают у меня. Не знаю что делать Private Sub TextBox1_KeyDown(ByVal KeyCode As...

Статистика нажатия кнопок
Есть на форме некоторые кнопки. Надо подсчитать сколько раз нажимали каждую кнопку.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru