Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 22
PySide

Изменить раскладку клавиатуры

05.04.2024, 00:46. Показов 796. Ответов 2

Студворк — интернет-сервис помощи студентам
Есть два класса Keyboard - наследован от QFrame, в котором находится клавиатура и KeyEvent - где обрабатываются нажатия кнопок.
Нужно, в классе KeyEvent реализовать событие, чтобы при нажатии на Shift + Alt менялся язык визуальной клавиатуры.
Я попытался сделать это через self.parent обратившись к элементам класса Keyboard, но ничего не вышло, возможно это делается как-то по другому

Файл create_keyboard.py

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
from PySide6.QtCore import QSize, Qt
from PySide6.QtWidgets import QFrame, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QVBoxLayout
from .key_events import KeyEvent
 
class Keyboard(QFrame):
 
    ru = ['', 'Ё', '1 !', '2 "', '3 №', '4 ;', '5 %', '6 :', '7 ?', '8 *', '9 (', '0 )', '- _', '= +', 'BackSpace', '',
            '', 'Tab', 'Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ', '\\ /', '',
            '', 'Caps', 'Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'Э', 'Enter', '',
            '', 'Shift', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', '. ,', 'LShift', '',
            '', 'Alt', 'Space', '']
    eng = ['', '` ~', '1 !', '2 @', '3 #', '4 $', '5 %', '6 ^', '7 &', '8 *', '9 (', '0 )', '- _', '= +', 'BackSpace', '',
            '', 'Tab', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[ {', '] }', '\\ |', '',
            '', 'Caps', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '; :', '\' "', 'Enter', '',
            '', 'Shift', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ', <', '. >', '/ ?', 'LShift', '',
            '', 'Alt', 'Space', '']
    keys = ru
    symbols = '~!@#$%^&*()_+\\{}:"<>?!"№;%:?*()_+/,|'
    sizes = {'BackSpace': (100, 140), 'Tab': (80, 110), '\\ /': (70, 100),
             '\\ |': (70, 100), 'Caps': (100, 130), 'Enter': (100, 155),
             'Shift': (130, 170), 'LShift': (130, 190), 'Space': (400, 550)}
    lines = {'Line_1': keys[:16], 'Line_2': keys[16:32], 'Line_3': keys[32:47],
             'Line_4': keys[47:61], 'Line_5': keys[61:]}
 
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setMaximumSize(QSize(16777215, 385))
        self.setupUI()
 
        self.events = KeyEvent(self)
 
    def setupUI(self):
        self.verticalLayout = QVBoxLayout(self)
        self.verticalLayout.setSpacing(5)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.verticalLayout.setContentsMargins(10, 0, 10, 0)
 
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
 
        for i, ln in enumerate(self.lines.keys()):
            line = QFrame(self)
            line.setObjectName(ln)
 
            horizontalLayout = QHBoxLayout(line)
            horizontalLayout.setSpacing(5)
            horizontalLayout.setObjectName(f"horizontalLayout_{i}")
            horizontalLayout.setContentsMargins(0, 0, 0, 0)
 
            for key in self.lines[ln]:
                if not key:
                    horizontalSpacer = QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
                    horizontalLayout.addItem(horizontalSpacer)
                    continue
 
                label = QLabel(line)
                if key[-1] in self.symbols:
                    label.setObjectName(f'Key_{key[0]}')
                else:
                    label.setObjectName(f'Key_{key}')
                sizePolicy.setHeightForWidth(label.sizePolicy().hasHeightForWidth())
                label.setSizePolicy(sizePolicy)
                label.setText(key)
                if key in self.sizes.keys():
                    minimal, maximum = self.sizes[key]
                    label.setMinimumSize(QSize(minimal, 50))
                    label.setMaximumSize(QSize(maximum, 70))
                else:
                    label.setMinimumSize(QSize(50, 50))
                    label.setMaximumSize(70, 70)
                label.setAlignment(Qt.AlignCenter)
                horizontalLayout.addWidget(label)
 
            for index, key in enumerate(self.lines[ln]):
                if key:
                    if (ln == 'Line_1' and index == 14 or ln == 'Line_2' and index in (1, 14)
                            or ln == 'Line_3' and index in (1, 13) or ln == 'Line_4' and index in (1, 12)):
                        horizontalLayout.setStretch(index, 3)
 
                    else:
                        horizontalLayout.setStretch(index, 1)
 
                    if ln == 'Line_5':
                        horizontalLayout.setStretch(0, 4)
                        horizontalLayout.setStretch(1, 1)
                        horizontalLayout.setStretch(2, 8)
                        horizontalLayout.setStretch(3, 4)
 
            self.verticalLayout.addWidget(line)
Файл key_events.py

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
from PySide6.QtCore import Qt, QObject
from PySide6.QtGui import QKeyEvent
from PySide6.QtWidgets import QLabel
from ctypes import WinDLL
 
 
def _get_capslock_state():
    hllDll = WinDLL("User32.dll")
    VK_CAPITAL = 0x14
    return hllDll.GetKeyState(VK_CAPITAL) != 0
 
 
class KeyEvent(QObject):
    keys = {Qt.Key_Backspace: "BackSpace", Qt.Key_Return: "Enter", Qt.Key_Space: "Space",
            Qt.Key_Tab: "Tab", Qt.Key_Alt: "Alt"}
 
    def __init__(self, parent=None):
        super().__init__(parent)
        self.parent = parent
        self.caps_on = _get_capslock_state()
        self.system_button = False
 
        if self.caps_on:
            self._search_button('Caps').setStyleSheet(u'background-color: #999999')
 
    def eventFilter(self, watched, event):
        if event.type() == QKeyEvent.KeyPress:
            key: QKeyEvent = event
 
            # Изменить клавиатуру здесь
            if key.modifiers() is Qt.AltModifier | Qt.ShiftModifier:
                pass
 
            if key.nativeScanCode() == 54:
                self._search_button('LShift').setStyleSheet(u'background-color: #999999')
            if key.nativeScanCode() == 42:
                self._search_button('Shift').setStyleSheet(u'background-color: #999999')
 
            for k, v in self.keys.items():
                if key.key() == k:
                    self._search_button(v).setStyleSheet(u'background-color: #999999')
                    self.system_button = True
 
            if key.key() == Qt.Key_CapsLock and not self.caps_on:
                self._search_button('Caps').setStyleSheet(u'background-color: #999999')
                self.caps_on = True
                return True
            elif key.key() == Qt.Key_CapsLock and self.caps_on:
                self._search_button('Caps').setStyleSheet(u'background-color: none')
                self.caps_on = False
 
            if not self.system_button:
                if key.modifiers() == Qt.ShiftModifier and key.text():
                    self._search_button(self._translate(key.text())).setStyleSheet(u'background-color: #999999')
 
                if key.modifiers() == Qt.NoModifier and key.text():
                    self._search_button(key.text().upper()).setStyleSheet(u'background-color: #999999')
 
        if event.type() == QKeyEvent.KeyRelease:
            key: QKeyEvent = event
 
            if key.nativeScanCode() == 54:
                self._search_button('LShift').setStyleSheet(u'background-color: none')
            if key.nativeScanCode() == 42:
                self._search_button('Shift').setStyleSheet(u'background-color: none')
 
            for k, v in self.keys.items():
                if key.key() == k:
                    self._search_button(v).setStyleSheet(u'background-color: none')
                    self.system_button = False
                    return True
 
            if key.modifiers() == Qt.ShiftModifier and key.text():
                self._search_button(self._translate(key.text())).setStyleSheet(u'background-color: none')
 
            if key.modifiers() == Qt.NoModifier and key.text():
                self._search_button(self._translate(key.text()).upper()).setStyleSheet(u'background-color: none')
 
        return super().eventFilter(watched, event)
 
    def _search_button(self, name):
        buttons = self.parent.findChildren(QLabel)
        for btn in buttons:
            name_button = btn.objectName().split('_')[1]
            if name_button == name:
                return btn
 
    def _translate(self, text):
        if self.parent.keys == self.parent.eng:
            maketrans = text.maketrans('~!@#$%^&*()_+|{}:"<>?', '`1234567890-=\\[];\',./')
        else:
            maketrans = text.maketrans('!"№;%:?*()_+/,', '1234567890-=\\.')
        return text.translate(maketrans)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2024, 00:46
Ответы с готовыми решениями:

Переключить раскладку клавиатуры Виндоуз скриптом
день добрый, может кто подсказать как программно переключить раскладку клавиатуры на питоне 3 нашел статью где используется модуль...

Как переключить раскладку клавиатуры в другом потоке (запущенной программе)?
Всем привет. Мне надо сделать вставку текста, имитировав нажатие CTRL+V и она не срабатывает если выбрана русская раскладка. Меняю...

Изменить глобально раскладку клавиатуры
Всем привет. Я пишу функционал, который программно переключает раскладку клавиатуры. Есть два куска кода, которые нужно состыковать. Значит...

2
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
07.04.2024, 21:59
Не ловится событие Shift+Alt? Приведите небольшой запусабельный пример демострирующий проблему.
1
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 22
24.04.2024, 01:59  [ТС]
Решил проблему объявив строку self.verticalLayout = QVBoxLayout(self) при инициализации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2024, 01:59
Помогаю со студенческими работами здесь

Как изменить раскладку клавиатуры?
как изменить раскладку клавиатуры? tc 3. шифт+контрол и шифт+алт и шифт+шифт не помогает

Определить раскладку клавиатуры и изменить ее
Задания на работу с API-функциями 1. Определить версию операционной системы и платформу. Определить раскладку клавиатуры и изменить...

Изменить раскладку клавиатуры в чужом приложении
Мне нужно изменить в чужом приложение раскладку клавиатуры на английскую. В гугле ничего полезного не нашел кроме //0x0050 - код...

Как в командной строке изменить раскладку клавиатуры на английскую?
Пишу прогу, после открытия окна для ввода данных автоматически раскладка меняется на русскую. Каждый раз переключать неудобно. То что...

Как узнать раскладку клавиатуры? Как её изменить? Как узнать, на каком языке текст в файле?
сабж


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru