Форум программистов, компьютерный форум, киберфорум
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. Показов 7929. Ответов 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,764
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,764
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,764
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
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере 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
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru