Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2022 10:50:15

Freedom83
Зарегистрирован: 2022-04-27
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Переключение раскладки клавиатуры

Добрый день.

меняю раскладку клавиатуры. но программа всё равно воспринимает предыдущее состояние, при котором она была запущена. как сделать так, чтобы обновилась информация по раскладки клавиатуры в действии программы

 import ctypes
import keyboard as kb
 
      
def get_layout():
    u = ctypes.windll.LoadLibrary("user32.dll")
    pf = getattr(u, "GetKeyboardLayout")
    if hex(pf(0)) == '0x4190419':
        return 'ru'
    if hex(pf(0)) == '0x4090409':
        return 'en'
 
ruen=""
 
def ichange():
    ruen=get_layout()
    if ruen=="en" : kb.press_and_release('alt + shift')
 
def istatus():
    ruen=get_layout()
    print (ruen)
 
def imain():
    istatus()
    ichange()
    istatus()
 
 
imain()

результат
en
en
>>>
повторный запуск
ru
ru
>>>

хотелось бы получить
en
ru

Отредактировано Freedom83 (Апрель 27, 2022 10:53:53)

Офлайн

#2 Апрель 27, 2022 11:52:28

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Переключение раскладки клавиатуры

 import pyautogui as p
p.hotkey('shift', 'alt')

Офлайн

#3 Апрель 27, 2022 12:59:54

Freedom83
Зарегистрирован: 2022-04-27
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Переключение раскладки клавиатуры

xam1816
результат
en
en
>>>
повторный запуск
ru
ru
>>>

Офлайн

#4 Апрель 27, 2022 21:31:39

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Переключение раскладки клавиатуры

  
ruen=""
 
def ichange():
    ruen=get_layout()
    if ruen=="en" : kb.press_and_release('alt + shift')
 
def istatus():
    ruen=get_layout()
    print (ruen)

области видимости, ruen внутри функции и ruen снаружи разные переменные

вот у тебя функция проверяет реестр, на выходе либо ‘ru’ либо ‘en’
 def get_layout():
    u = ctypes.windll.LoadLibrary("user32.dll")
    pf = getattr(u, "GetKeyboardLayout")
    if hex(pf(0)) == '0x4190419':
        return 'ru'
    if hex(pf(0)) == '0x4090409':
        return 'en'

вот у тебя функция,которая переключает раскладку
 kb.press_and_release('alt + shift')

вот функция которая переводит в ‘ru’
  
def set_ru():
    if get_layout() == 'en':
        kb.press_and_release('alt + shift')

вот функция перевода в ‘en’
  
def set_en():
    if get_layout() == 'ru':
        kb.press_and_release('alt + shift')

вот тест

  
def test():
    set_en()
    print(get_layout())
    set_ru()
    print(get_layout())
    set_ru()
    print(get_layout())
    set_en()
    print(get_layout())

вот целиком

  
import ctypes
import keyboard as kb
def get_layout():
    u = ctypes.windll.LoadLibrary("user32.dll")
    pf = getattr(u, "GetKeyboardLayout")
    if hex(pf(0)) == '0x4190419':
        return 'ru'
    if hex(pf(0)) == '0x4090409':
        return 'en'
def set_ru():
    if get_layout() == 'en':
        kb.press_and_release('alt + shift')
def set_en():
    if get_layout() == 'ru':
        kb.press_and_release('alt + shift')
def test():
    set_en()
    print(get_layout())
    set_ru()
    print(get_layout())
    set_ru()
    print(get_layout())
    set_en()
    print(get_layout())
test()

или вот
  
import subprocess
import pyautogui as p
def get_layout():
    try:
        import ctypes # windows
        u = ctypes.windll.LoadLibrary("user32.dll")
        pf = getattr(u, "GetKeyboardLayout")
        if hex(pf(0)) == '0x4190419':
            return 'ru'
        if hex(pf(0)) == '0x4090409':
            return 'en'
    except: # linux
        pr = subprocess.Popen("xset -q|grep LED| awk '{ print $10 }'", stdout=subprocess.PIPE, shell=True)
        data = pr.communicate()[0].decode().strip()
        if data == '00001004':
            return "ru"
        if data == '00000000':
            return "en"
def set_ru():
    if get_layout() == 'en':
        p.hotkey('shift', 'alt')
def set_en():
    if get_layout() == 'ru':
        p.hotkey('shift', 'alt')
def test():
    set_en()
    print(get_layout())
    set_ru()
    print(get_layout())
    set_ru()
    print(get_layout())
    set_en()
    print(get_layout())
    set_en()
    print(get_layout())
test()

Отредактировано xam1816 (Апрель 27, 2022 22:42:37)

Офлайн

#5 Апрель 29, 2022 09:03:02

Freedom83
Зарегистрирован: 2022-04-27
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Переключение раскладки клавиатуры

xam1816
 import subprocess
import pyautogui as p
import ctypes # windows
u = ctypes.windll.LoadLibrary("user32.dll")
pf = getattr(u, "GetKeyboardLayout")
if hex(pf(0)) == '0x4190419':
    ruen='ru'
if hex(pf(0)) == '0x4090409':
    ruen='en'
    
print(ruen)
if ruen== 'en':
    p.hotkey('shift', 'alt')    
print(ruen)

en
en
>>>
ru
ru
>>>

если я правильно понял, то ruen должна быть в теле функции
переписал вообще без функций, результат не изменился.

Такое ощущение, что надо как-то перезапустить процесс питона (idle)

Отредактировано Freedom83 (Апрель 29, 2022 09:39:28)

Офлайн

#6 Апрель 29, 2022 21:58:04

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Переключение раскладки клавиатуры

Freedom83
переписал вообще без функций, результат не изменился.
именно в этом отрывке
  
print(ruen)
if ruen== 'en':
    p.hotkey('shift', 'alt')    
print(ruen)
где ruen меняет значение?

Офлайн

#7 Май 4, 2022 08:37:24

Freedom83
Зарегистрирован: 2022-04-27
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Переключение раскладки клавиатуры

xam1816
справа, где часы
запускаю в idle, windows 10, python 3.9

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version