Найти - Пользователи
Полная версия: Переключение раскладки клавиатуры
Начало » Python для новичков » Переключение раскладки клавиатуры
1
Freedom83
Добрый день.

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

 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
xam1816
 import pyautogui as p
p.hotkey('shift', 'alt')
Freedom83
xam1816
результат
en
en
>>>
повторный запуск
ru
ru
>>>
xam1816
  
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()
Freedom83
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)
xam1816
Freedom83
переписал вообще без функций, результат не изменился.
именно в этом отрывке
  
print(ruen)
if ruen== 'en':
    p.hotkey('shift', 'alt')    
print(ruen)
где ruen меняет значение?
Freedom83
xam1816
справа, где часы
запускаю в idle, windows 10, python 3.9
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB