Advertisement
egor230

новая клавиатура.py

Apr 15th, 2025 (edited)
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.78 KB | Source Code | 0 0
  1. import tkinter as tk
  2. from tkinter import ttk, Text, Toplevel, messagebox
  3. import os, json, copy, subprocess, threading
  4. from deepdiff import DeepDiff
  5. from pynput import keyboard
  6. from pynput.keyboard import Controller as Contr1, Key
  7. class save_dict:
  8.  def __init__(self):
  9.   self.key_last =""
  10.   self.keyboard_script = {}
  11.   self.old_data = {}
  12.   self.data="setting_keyboard_script.json" # файл настроек. print(data)
  13.   if os.path.exists(self.data):  # есть ли этот файл.
  14.    with open(self.data) as json_file:  # загрузка настроек из файла.
  15.     self.keyboard_script  = json.load(json_file)
  16.     self.old_data= copy.deepcopy(self.keyboard_script)
  17.   else:  # Если нет файла создать настройки.
  18.    self.keyboard_script  = {}
  19.    k.save_jnson(keyboard_script)
  20.  def save_jnson(self, jn):# сохранить настройки
  21.    self.keyboard_script= jn
  22.  
  23.  def return_jnson(self):# Вернуть новые настройки.
  24.     return self.keyboard_script
  25.  
  26.  def get_key_last(self):
  27.     return self.key_last
  28.  def set_key_last(self, key_last):
  29.      self.key_last=key_last
  30.      return self.key_last
  31.  def write_to_file(self):
  32.   if self.keyboard_script != self.old_data:
  33.    if (messagebox.askokcancel("Quit", "Do you want to save the changes?")):
  34.     json_string = json.dumps(self.keyboard_script, ensure_ascii=False, indent=2)  # self.data # файл настроек.
  35.     with open(self.data, "w", encoding="UTF-8") as w:
  36.      w.write(json_string)  # сохранить изменения в файле настроек.
  37.   return self
  38. # Создаем словари
  39. en_to_ru = { 'a': 'ф', 'A': 'Ф', 'b': 'и', 'B': 'И', 'c': 'с', 'C': 'С', 'd': 'в', 'D': 'В', 'e': 'у', 'E': 'У', 'f': 'а', 'F': 'А', 'g': 'п', 'G': 'П', 'h': 'р', 'H': 'Р', 'i': 'ш', 'I': 'Ш', 'j': 'о', 'J': 'О', 'k': 'л', 'K': 'Л',
  40.     'l': 'д', 'L': 'Д', 'm': 'ь', 'M': 'Ь', 'n': 'т', 'N': 'Т', 'o': 'щ', 'O': 'Щ', 'p': 'з', 'P': 'З', 'q': 'й', 'Q': 'Й', 'r': 'к', 'R': 'К', 's': 'ы', 'S': 'Ы', 't': 'е', 'T': 'Е', 'u': 'г', 'U': 'Г', 'v': 'м', 'V': 'М',
  41.     'w': 'ц', 'W': 'Ц', 'x': 'ч', 'X': 'Ч', 'y': 'н', 'Y': 'Н', 'z': 'я', 'Z': 'Я', '.': '-', ',': '+', ' ': ' '}
  42.  
  43. ru_to_en = { 'ф': 'a', 'Ф': 'A', 'и': 'b', 'И': 'B', 'с': 'c', 'С': 'C', 'в': 'd', 'В': 'D', 'у': 'e', 'У': 'E', 'а': 'f', 'А': 'F', 'п': 'g', 'П': 'G', 'р': 'h', 'Р': 'H', 'ш': 'i', 'Ш': 'I', 'о': 'j', 'О': 'J', 'л': 'k', 'Л': 'K',    'д': 'l', 'Д': 'L', 'ь': 'm', 'Ь': 'M', 'т': 'n', 'Т': 'N', 'щ': 'o', 'Щ': 'O', 'з': 'p', 'З': 'P', 'й': 'q',
  44.     'Й': 'Q', 'к': 'r', 'К': 'R', 'ы': 's', 'Ы': 'S', 'е': 't', 'Е': 'T', 'г': 'u', 'Г': 'U', 'м': 'v', 'М': 'V',
  45.     'ц': 'w', 'Ц': 'W', 'ч': 'x', 'Ч': 'X', 'н': 'y', 'Н': 'Y', 'я': 'z', 'Я': 'Z', '-': '.', '+': ',', ' ': ' '}
  46.  
  47. def on_press(key):  # обработчик клави.  # print(key )
  48.   key = str(key).replace(" ", "").replace('\'','') # Очищаем от ненужного
  49.   for i in list(k.return_jnson().keys()): # Получаем клавиши которые являются макросами.
  50.     i=str(i)
  51.     if key in ru_to_en.keys():# нужно перевести нужно перевести русскую клавишу в английскую.
  52.      key=ru_to_en[key]
  53.     if key == i.lower():# теперь нужно перевести ее в нижней регистр.
  54.      key1 = k.return_jnson()
  55.      script=key1[key.upper()]
  56.      listener.stop()
  57.      t = threading.Thread(target=lambda: subprocess.call(['bash', '-c', script]))
  58.      t.start()
  59.      t.join()
  60.      start_listener()
  61. def on_release(key):
  62.   pass
  63.   return True
  64.  
  65. def start_listener():
  66.  global listener
  67.  listener = keyboard.Listener(on_press=on_press, on_release=on_release)
  68.  listener.start()
  69.  
  70. # Запускаем слушатель
  71. start_listener()
  72. k= save_dict()
  73. # Добавляем текст в текстовое поле
  74. def add_text(key, text_widget):
  75.  
  76.   if key == "Ctrl":
  77.       key = "ISO_Next_Group"
  78.   if key == "Space":
  79.       key = "space"
  80.  
  81.   if key == "Левая":
  82.       sc = (f'xte "mousedown 1"\n'
  83.             f'sleep 0.23\n'
  84.             f'xte "mouseup 1"\n')
  85.   elif key == "Правая":
  86.       sc = (f'xte "mousedown 3"\n'
  87.             f'sleep 0.23\n'
  88.             f'xte "mouseup 3"\n')
  89.   elif key == "wheel_up":
  90.       sc = (f'xte "mousedown 4"\n'
  91.             f'sleep 0.23\n'
  92.             f'xte "mouseup 4"\n')
  93.   elif key == "mouse_middie":
  94.       sc = (f'xte "mousedown 2"\n'
  95.             f'sleep 0.23\n'
  96.             f'xte "mouseup 2"\n')
  97.   elif key == "wheel_down":
  98.       sc = (f'xte "mousedown 5"\n'
  99.             f'sleep 0.23\n'
  100.             f'xte "mouseup 5"\n')
  101.   else:
  102.       sc = (f'xte "keydown {key}"\n'
  103.             f'sleep 0.23\n'
  104.             f'xte "keyup {key}"\n')
  105.  
  106.   text_widget.insert(text_widget.index("insert"), sc)
  107.   keyboard_script = k.return_jnson()
  108.   keyboard_script[k.get_key_last()]= text_widget.get("1.0", "end-1c")  # Извлекаем текст из text_widget""
  109.   k.save_jnson(keyboard_script)
  110. # Окно клавиатуры
  111. def create_keyboard(root):
  112.   window = Toplevel(root)  # основа
  113.   window.geometry("1350x340+240+580")  # Используем geometry вместо setGeometry
  114.   keyboard_layout = [
  115.    ['Esc', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12', 'Insert', 'Delete', 'Home',
  116.     'End', 'PgUp', 'PgDn']
  117.    , ['~\n`', '!\n1', '@\n2', '#\n3', '$\n4', '%\n5', '^\n6', '&\n7', '*\n8', '(\n9', ')\n0', '_\n-', '+\n=',
  118.       'Backspace', 'Num Lock', '/', '*', '-']
  119.    , ['Tab', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{\n[', '}\n]', '|\n\\', ' 7\nHome', '8\n↑', '9\nPgUp',
  120.       '+']
  121.    , ['Caps Lock', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':\n;', '"\n\'', '\nEnter\n', '4\n←', '5\n', '6\n→']
  122.    , ['Shift_L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<\n,', '>\n.', '?\n/', 'Shift', '1\nEnd', '2\n↓', '3\nPgDn', 'KEnter']
  123.    , ['Ctrl', 'Windows', 'Alt_L', 'Space', 'Alt_r', 'Fn', 'Menu', 'Ctrl_r', 'up', '0\nIns', ' . ']
  124.    , ['Left', 'Down', 'Right']
  125.   ]
  126.   buttons={}
  127.   style = ttk.Style()  # При нажатии кнопка меняет свой цвет.
  128.   style.configure('TButton', background='lightgray')
  129.   style.map('TButton', background=[('active', 'blue')])
  130.   for i, row in enumerate(keyboard_layout):  # Создаем клавиатуру.
  131.    for j, key in enumerate(row):
  132.     x1 = 70 * j + 6
  133.     y1 = 50 * i + 6
  134.     button = ttk.Button(window, text=key, width=5, style='TButton')
  135.     buttons[button]=key
  136.     if key == 'Backspace':  # Условие только для Backspace
  137.      button = ttk.Button(window, text=key, width=10, style='TButton')
  138.      buttons[button]=key
  139.      button.place(x=x1, y=y1)
  140.     elif i == 1 and j > 13:  # Смещение кнопок NumPad после Backspace
  141.      button.place(x=x1 + 69, y=y1)  # Сдвигаем вправо на 80 пикселей
  142.     else:
  143.      button.place(x=x1, y=y1)
  144.     if key in [' 7\nHome', '8\n↑', '9\nPgUp', '+']:
  145.      x2 = x1 + 69
  146.      button.place(x=x2, y=y1)
  147.      if key == "+":
  148.       button.config(text="\n\n" + key + "\n")
  149.     if key in ['4\n←', '5\n', '6\n→']:
  150.      x2 = x1 + 140
  151.      button.place(x=x2, y=y1)
  152.     if key in ['1\nEnd', '2\n↓', '3\nPgDn', 'KEnter']:
  153.      x2 = x1 + 210
  154.      button.place(x=x2, y=y1)
  155.      if key == "KEnter":
  156.       button.config(text="\n\n" + key + "\n")
  157.     if i == 5:
  158.      if key in ['Ctrl', 'Windows', 'Alt']:
  159.       button.place(x=x1, y=y1)
  160.      if key == "Space":
  161.       button = ttk.Button(window, text=key, width=30, style='TButton')
  162.       button.place(x=x1, y=y1)
  163.  
  164.       buttons[button] = key
  165.      elif key in ['Alt_r', 'Fn', 'Menu', 'Ctrl_r']:
  166.       x2 = x1 + 210
  167.       button.config(width=5)  # Устанавливаем ширину 15 для "0\nIns"
  168.       button.place(x=x2, y=y1)
  169.      elif key == 'up':
  170.       x2 = x1 + 280
  171.       button.config(width=5)
  172.       button.place(x=x2, y=y1)
  173.      elif key == "0\nIns":
  174.       x2 = x1 + 420
  175.       button.config(width=15)  # Устанавливаем ширину 15 для "0\nIns"
  176.       button.place(x=x2, y=y1)
  177.      elif key == ' . ':
  178.       x2 = x1 + 490
  179.       button.config(width=5)
  180.       button.place(x=x2, y=y1)
  181.     if i == 6:
  182.      if key in ['Left', 'Down', 'Right']:
  183.       x2 = x1 + 770
  184.       button.config(width=5)
  185.       button.place(x=x2, y=y1 - 9)
  186.  
  187.   return window, buttons
  188.  
  189. root = tk.Tk()
  190. def main_window():
  191.  start_listener()
  192.  window, buttons = create_keyboard(root)# создаем окно с клавиатурой. Надо нажать 1 кнопку
  193.  window.title("Выбор клавиш")
  194.  keys_active= k.return_jnson().keys()# Список кнопок из файла которые надо обозначить синим.
  195.  
  196.  for button, key in buttons.items():# Прикрепляем функцию add_text к каждой кнопке
  197.   button.configure(command=lambda k=key, w=window : close_window(k, w))# при нажатии любой кнопка выходит новая клавиатура с редактором
  198.  
  199.   if key in keys_active:
  200.    style = ttk.Style()# Меняем цвет тех кнопок которые уже были назначены.
  201.    style.configure("Custom.TButton", background="blue", foreground="white")
  202.    button.configure(style="Custom.TButton")
  203.  
  204. def kill_notebook(w, n):
  205.  w.destroy()  # Закрываем предыдущую клавиатуру.
  206.  n.destroy()
  207.  main_window()
  208. def kill_keyboard(w, n):
  209.  kill_notebook(w, n)
  210.  k.write_to_file()
  211. def close_window(key,w):
  212.  k.set_key_last(key)
  213.  keys_active = k.return_jnson().keys()
  214.  window, buttons = create_keyboard(root)# создаем новую
  215.  window.title(f"Запись макроса для клавиши {key}")  # Устанавливаем заголовок окна
  216.  
  217.  window.geometry("1610x340+140+480")  # Используем geometry вместо setGeometry
  218.  
  219.  mouse_key_left_button = ttk.Button(window, text="\n\nЛевая\n\n", width=6, style='TButton')
  220.  mouse_key_left_button.place(x=1340, y=100)
  221.  buttons[mouse_key_left_button] = "Левая"
  222.  
  223.  mouse_wheel_up = ttk.Button(window, text="wheel_up", width=11, style='TButton')
  224.  mouse_wheel_up.place(x=1410, y=50)
  225.  buttons[mouse_wheel_up] = "wheel_up"
  226.  #
  227.  mouse_key_middie_button = ttk.Button(window, text="mouse_middie", width=11, style='TButton')
  228.  mouse_key_middie_button.place(x=1410, y=140)
  229.  buttons[mouse_key_middie_button] = "mouse_middie"
  230.  
  231.  mouse_wheel_down = ttk.Button(window, text="wheel_down", width=11, style='TButton')
  232.  mouse_wheel_down.place(x=1410, y=220)
  233.  buttons[mouse_wheel_down] = "wheel_down"
  234.  
  235.  mouse_key_right_button = ttk.Button(window, text="\n\nПравая\n\n", width=6, style='TButton')
  236.  mouse_key_right_button.place(x=1530, y=100)
  237.  buttons[mouse_key_right_button] = "Правая"
  238.  note = Toplevel(root)  # основа
  239.  note.title("Скрипт")
  240.  
  241.  notebook = ttk.Notebook(note)
  242.  notebook.grid(row=0, column=0, sticky="nsew")
  243.  
  244.  note.protocol("WM_DELETE_WINDOW", lambda: kill_notebook(window, note))
  245.  tab1 = ttk.Frame(notebook)
  246.  notebook.add(tab1, text="Окно редактора скрипта")
  247.  keyboard_script=k.return_jnson()
  248.  text_widget = Text(tab1, wrap='word') # Текстовый редактор
  249.  text_widget.grid(row=0, column=0, sticky="nsew")
  250.  w.destroy()# Закрываем предыдущую клавиатуру.
  251.  if key in keys_active:
  252.   text_content =keyboard_script[key]
  253.   text_widget.insert('end', text_content)
  254.  window.protocol("WM_DELETE_WINDOW", lambda: kill_keyboard(window, note))
  255.  for button, key in buttons.items():# каждой клавише присваиваем свою функци.
  256.   button.configure(command=lambda k=key, t=text_widget: add_text(k, t))
  257.  
  258. main_window()# Запуск окна.
  259.  
  260. root.mainloop()
  261.  
  262.  
  263.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement