Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 14.05.2020
Сообщений: 5
1
PyQt5

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

30.06.2020, 23:07. Просмотров 234. Ответов 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._add_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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2020, 23:07
Ответы с готовыми решениями:

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

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

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

Эмуляция нажатия кнопок
Хочу сделать l2mult, это программа которая в свернутое окно шлет нажатие клавишь. Тот кто...

3
431 / 318 / 139
Регистрация: 10.12.2016
Сообщений: 935
01.07.2020, 11:02 2
типа так
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
431 / 318 / 139
Регистрация: 10.12.2016
Сообщений: 935
01.07.2020, 18:35 3
имхо вы излишне усложняете задачу
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
431 / 318 / 139
Регистрация: 10.12.2016
Сообщений: 935
03.07.2020, 12:06 4
в питоне есть функция 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2020, 12:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Обработка нажатия кнопок.
Здравствуйте! Подскажите где, как подправить чтобы правильно все заработало? Нажимаем на BUT1...

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

Обработка нажатия кнопок
Здравствуйте! У меня есть поле bool ChangingColor = true; И событие private void...

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

Обработка нажатия кнопок
Здравствуйте! Недавно начал изучать программирование под Android. Узнал что для обработки нажатия...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.