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

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

05.04.2024, 00:46. Показов 725. Ответов 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
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru