Advertisement
egor230

Mouse setting control for buttons python linux

Dec 13th, 2022 (edited)
954
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 35.09 KB | Source Code | 0 0
  1. from Mouse_libs import *
  2.  
  3. def update_buttons(event=0):# Изменение назначения кнопок.
  4.   dict_save.set_current_path_game(" ")
  5.   dict_save.set_default_id_value(add_button_start)
  6.   box_value = dict_save.return_box_values() # Получить значения выпадающего списка
  7.   res=dict_save.return_jnson()
  8.   box_values=[box_value[0].get(), box_value[1].get(), box_value[2].get(),
  9.               box_value[3].get(),box_value[4].get(),box_value[5].get(),box_value[6].get()]
  10.   res["key_value"][str(dict_save.get_cur_app())]=box_values
  11.   dict_save.set_id(id_value.get())
  12.  
  13.   res["current_app"]=str(dict_save.get_cur_app())  # add_button_start["state"] = "normal"
  14.   res["id"]=id_value.get()
  15.   dict_save.save_jnson(res)  # Сохранить новые настройки.  # print("change color label")
  16.   start_startup_now(dict_save, root)
  17.  
  18. def update_check_button(event):# Галочка запускать при старте.
  19.  dict_save.set_default_id_value(add_button_start)
  20.  res= dict_save.return_jnson()
  21.  if start_startup.get():
  22.   res["start_startup"]= False  #
  23.  else:
  24.   res["start_startup"]= True  #
  25.  dict_save.save_jnson(res)# Сохранить изменения
  26.  
  27. def checkbutton_changed(event, var_list, count, name_games, labels, curr_app):  # галочки
  28.   dict_save.set_cur_app(curr_app)# Установить текущий путь к игре напротив галочки
  29.   dict_save.set_count(count)
  30.   res = dict_save.return_jnson()
  31.   if var_list[count].get() == False:
  32.     labels[count].config(background="#06c")  # текстовое поле и кнопка для добавления в список
  33.     res["games_checkmark"][str(dict_save.get_cur_app())] = True
  34.   else:
  35.     labels[count].config(background="white")  # текстовое поле и кнопка для добавления в список
  36.     res["games_checkmark"][str(dict_save.get_cur_app())] = False
  37.   for i in range(len(labels)):
  38.     if i != count:
  39.       labels[i].config(background="white")
  40.  
  41.   update_buttons(event)# Обновить кнопки.
  42.  
  43. def update_mouse_check_button(count):# сохранение после установки флажков.  print(count)
  44.   res=dict_save.return_jnson()
  45.   curr_name=dict_save.get_cur_app()#  print(count)  print(len(res["mouse_press"][curr_name]))
  46.   # Проверка наличия ключа перед его обновлением
  47.   if curr_name in res["mouse_press"]:
  48.     # Изменение значения на противоположное
  49.     res["mouse_press"][curr_name][count] = not res["mouse_press"][curr_name][count]
  50.     list_mouse_button_press = res["mouse_press"][curr_name]  # print(list_mouse_button_press)  # Обновить список флажков.
  51.     dict_save.set_default_id_value(add_button_start)
  52.     dict_save.save_jnson(res)
  53. def mouse_check_button(dict_save, res,curr_name):
  54.   list_mouse_button_press = list(res["mouse_press"][curr_name])#  print(d)
  55.   mouse_press_button = []# список нажатых кнопок.
  56.   cd1_y = 30
  57.   for count, i in enumerate(list_mouse_button_press):
  58.     mouse_press_button.append(BooleanVar())
  59.     mouse_press_button[count].set(i)
  60.     cb1 = Checkbutton(root, variable=mouse_press_button[count],  # создания галочек
  61.                       onvalue=1, offvalue=0, state=NORMAL,  command=lambda c=count: update_mouse_check_button(c))  # Исправление здесь
  62.     cb1.place(x=490, y=cd1_y)
  63.     cd1_y = cd1_y + 30
  64.     CreateToolTip(cb1, text='Держать нажатой')  # вывод надписи
  65.   dict_save.save_mouse_button_press(list_mouse_button_press, mouse_press_button)
  66.  
  67. def set_colol_white_label_changed(labels):# Установить белый цвет для всех label
  68.   for i in range(len(labels)):
  69.     labels[i].config(background="white")  # у всех надписей снять выделения
  70.  
  71. def change(event, window, new_name, old_name, res, count, labels):# Окно изменение названия игры
  72.   new_name = new_name.get()  # print(new_name, old_name, end=" , ")
  73.   if new_name != "" and new_name != old_name:
  74.     res["paths"][list(res["paths"])[count]]=new_name
  75.     labels[count].config(text=new_name)#  res["paths"][dict_save.get_cur_app()] = new_name.get()
  76.   window.destroy()  # Закрытие окна после сохранения изменений
  77. def change_name_label(event, count): #Изменить название игры
  78.   window = Toplevel(root)  # основа
  79.   window.title("change_name")  # заголовок
  80.   window.geometry("350x150+750+400")  # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране.
  81.   window.configure(bg='DimGray')  # Цвет фона окна
  82.   labels = dict_save.return_labels()
  83.   res = dict_save.return_jnson()
  84.   old_name=res["paths"][list(res["paths"])[count]]
  85.  
  86.   new_name = StringVar()
  87.   e = Entry(window, width=25, textvariable=new_name)
  88.   e.grid(column=2, row=0, padx=50, pady=5)
  89.   e.focus()  # Фокусируемся на текстовом поле
  90.   new_name.set(old_name)
  91.   # Кнопка теперь является частью нового диалогового окна `window`, а не исходного `root`
  92.   Button(window, text="Ok", command=lambda: change(None, window, new_name, old_name, res, count,  labels)) \
  93.     .grid(column=2, row=1, padx=50, pady=30)  # кнопка, откроется новое окно.
  94.   e.bind('<Return>', lambda event: change(event, window, new_name, old_name, res, count,labels))
  95.  
  96. def check_label_changed(event, labels, count, var_list):# изменение цвета label
  97.  set_colol_white_label_changed(labels)  # Установить белый цвет для всех label print(count)
  98.  if count != dict_save.get_count() :
  99.   dict_save.set_count(count)
  100.   res = labels[count].cget("background")
  101.   for i in range(len(labels)):
  102.    if i != count:
  103.     labels[i].config(background="white")
  104.    if str(res) =="white":
  105.      labels[count].config(background="#06c")
  106.      var_list[count].set(True)
  107.  else:
  108.      if "white" == labels[count].cget("background"):
  109.       labels[count].config(background="#06c")
  110.      else: # в белый
  111.       labels[count].config(background="white")
  112.  res=dict_save.return_jnson()
  113.  game=list(res['paths'].keys())[count]
  114.  res['current_app'] = game# Выбранная игра.
  115.  dict_save.set_prev_game(game)
  116.  # print(game)
  117.  while game!=dict_save.get_cur_app(): # получить значение текущей активной строки.
  118.     dict_save.set_cur_app(game)
  119.  
  120.  # dict_save.set_box_values(add_button_start)
  121.  # update_buttons(event)# Изменение назначения кнопок.
  122.  dict_save.set_values_box()# установить значения клавиш.
  123.  # print(dict_save.get_cur_app())
  124.  mouse_check_button(dict_save, res, dict_save.get_cur_app()) # флаг для удержания кнопки мыши.
  125.  # print(dict_save.get_current_path_game()) # номер записи.
  126.  # Если мы переключили надпись, стоит флажок запускать старте.
  127.  # start_startup_now(dict_save, root)
  128.  create_scrypt_buttons()
  129. def add_file(dict_save):# Добавить новые игры
  130.  res=dict_save.return_jnson() # получаем настройки
  131.  keys_values =res["key_value"][dict_save.get_cur_app()]# конфигурация кнопок от предыдущего профиля.
  132.  mouse_press_old =res["mouse_press"][dict_save.get_cur_app()]# какие кнопки имеют залипания.
  133.  
  134.  # print(dict_save.get_current_app_path())
  135.  cmd = ['zenity', '--file-selection', '--file-filter=EXE files | *.exe'] # Zenity команда для выбора одного exe файла
  136.  # Вызов zenity и получение выбранного пути
  137.  result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, text=True)
  138.  path_to_file = result.stdout.strip()# новый путь к игре
  139.  
  140.  name_with_expansion = path.basename(path_to_file)# Получение базового имени файла с расширением из полного пути к файлу
  141.  name = path.splitext(name_with_expansion)[0] # Отделение имени файла без расширения путем разбиения строки.
  142.  li= list(res["paths"].keys())
  143.  if path_to_file in li:
  144.    return 0
  145.  res["paths"][str(path_to_file)]=str(name)
  146.  res["games_checkmark"][str(path_to_file)]=True
  147.  res["key_value"][str(path_to_file)]=keys_values # сохранить пред значения
  148.  res["mouse_press"][str(path_to_file)]= list(mouse_press_old)
  149.  res1= res["key_value"]
  150.  if path_to_file in res1:
  151.      pass
  152.  else:
  153.      res["key_value"][path_to_file]=["LBUTTON","RBUTTON",  "WHEEL_MOUSE_BUTTON",
  154.       "WHEEL_MOUSE_UP", "WHEEL_MOUSE_DOWN", 'XBUTTON1', 'XBUTTON2']
  155.  
  156.  dict_save.save_jnson(res)
  157.  labels=dict_save.return_labels()
  158.  for i in range(len(labels)):
  159.    labels[i].destroy()
  160.  
  161.  labels.clear()
  162.  name_games = dict_save.return_name_games()
  163.  name_games.clear()
  164.  var_list = dict_save.return_var_list()
  165.  var_list.clear()
  166.  labels_with_checkmark = dict_save.return_labels_with_checkmark()
  167.  labels_with_checkmark.clear()
  168.  labels=dict_save.return_labels()
  169.  dict_save.count=+1
  170.  filling_in_fields(res)
  171.  set_colol_white_label_changed(labels)  # Установить белый цвет для всех label
  172.  
  173.  # keys_values= dict_save.return_box_values()
  174.  # old_keys_values=[]
  175.  # for i in range(len(keys_values)):
  176.  #     old_keys_values.append(keys_values[i].get())
  177.  
  178.  labels[len(labels)-1].config(background="#06c")  # текстовое поле и кнопка для добавления в список
  179. checkbutton_list=[]
  180. def fill_labes(res, name_games,labels,var_list, labels_with_checkmark):
  181.   check_mark = res["games_checkmark"]
  182.   d=res["paths"]
  183.   for count, i in enumerate(d):    # print(count)
  184.     name_game = StringVar()    # i это пути к играм
  185.     name_game = d[i] # называния игр.
  186.     box_key = StringVar()    # dict_save.set_cur_app(i)
  187.     name_games.append(name_game)
  188.     labels.append(Label(root, background="white", text=name_games[count], width=28, relief=GROOVE, justify="left"))
  189.     y1 = (count + 1) * 25 + 1
  190.  
  191.     # галочки
  192.     var_list.append(BooleanVar())
  193.     check_mark = res["games_checkmark"]
  194.     bool_check_mark = check_mark[i]
  195.     var_list[count].set(bool_check_mark)
  196.     labels_with_checkmark[labels[count]] = var_list[count]
  197.     cb = Checkbutton(root, variable=var_list[count],  # создания галочек
  198.                      onvalue=1, offvalue=0, state=ACTIVE)
  199.     cb.bind("<Button-1>", lambda event, agr=var_list, agr1=count, agr2=name_games, agr3=labels, agr4=i:
  200.     checkbutton_changed(event, agr, agr1, agr2, agr3, agr4))
  201.     cb.place(x=7, y=y1 - 2)
  202.     checkbutton_list.append(cb)
  203.     # надписи
  204.     labels[count].bind("<Button-1>", lambda event, agr=labels, agr1=count, agr2=var_list:
  205.     check_label_changed(event, agr, agr1, agr2))
  206.     labels[count].bind('<Button-3>', lambda event, agr=count: change_name_label(event, agr))
  207.     labels[count].place(x=10, y=y1)  # текстовое поле и кнопка для добавления в список
  208.  
  209.   keys = list(res['paths'].keys())# Получить все пути игр.
  210.   index = keys.index(res['current_app'])# Узнать индекс текущей игры.
  211.  
  212.   #активное приложение.
  213.   labels[index].config(background="#06c") # Установить cиний цвет.  print(index)
  214.   dict_save.set_count(index)# Установить  индекс текущей игры.
  215.   dict_save.set_box_values(add_button_start)  # Установить значения выпадающего списка.
  216.   dict_save.set_values_box()
  217. def filling_in_fields(res):# заполнения всех полей.
  218.     labels=dict_save.return_labels()
  219.     name_games=dict_save.return_name_games()# имя игр
  220.     var_list=dict_save.return_var_list()
  221.     labels_with_checkmark= dict_save.return_labels_with_checkmark()
  222.     boxs = dict_save.return_box_values()
  223.     fill_labes(res, name_games, labels, var_list, labels_with_checkmark)    # if dict_save.get_count()==0:    #    print("ok")    #  labels[dict_save.get_count()].config(background="#06c")
  224.     dict_save.set_box_values(add_button_start)  # Установить значения выпадающего списка.
  225.     dict_save.set_values_box()
  226. def start(root, dict_save):# запуск.
  227.  
  228.  data = dict_save.data  # файл настроек. print(data)
  229.  if os.path.exists(data):  # есть ли этот файл.
  230.    with open(data) as json_file:# загрузка настроек из файла.
  231.     res = json.load(json_file)
  232.  else:  # Если нет файла создать настройки.
  233.     res ={ 'games_checkmark': {'C:/Windows/explorer.exe': True},
  234.    'paths': {'C:/Windows/explorer.exe': 'По умолчанию'        },
  235.    'key_value': {'C:/Windows/explorer.exe': ['LBUTTON', 'RBUTTON', 'WHEEL_MOUSE_BUTTON', 'SCROLL_UP',
  236.                  'SCROLL_DOWN', 'SCROLL_UP', 'SCROLL_DOWN']   },
  237.    "mouse_press": {  "C:/Windows/explorer.exe": [ False, False,
  238.      False, False, False, False, False ] },
  239.    "start_startup" : False,# Флаг запускать при старте.
  240.    "id": 0, # Какой id устройства
  241.    "current_app" : 'C:/Windows/explorer.exe'}
  242.  
  243.     know_id = f'''#!/bin/bash
  244.     input_list=$(xinput list)  # Получаем список устройств ввода
  245.     # Исключаем линию с 'Consumer Control' и выбираем первую подходящую строку
  246.     mouse_line=$(echo "$input_list" | head -n 1)
  247.  
  248.     if [ -n "$mouse_line" ]; then  # Если строка найдена, извлекаем ID
  249.          mouse_id=$(echo "$mouse_line" | grep -o "id=[0-9]*" | cut -d "=" -f 2)
  250.          echo "$mouse_id"
  251.     fi
  252.     '''  # Запускаем скрипт нахождения id мыши.
  253.     res["id"] = int(subprocess.run(['bash', '-c', know_id], capture_output=True, text=True).stdout.strip())# print(type(res["id"])) print(res["id"])
  254.  
  255.  d = list(res["paths"].keys()) # получить словарь путей и имен файлов.
  256.  start_startup.set(res["start_startup"]) # print(res['id']) # input()
  257.  dict_save.save_old_data(res) # сохранить значения настроек из файла.
  258.  dict_save.set_cur_app(res["current_app"])  # установить текущую активную строку.
  259.  
  260.  dict_save.set_prev_game(res["current_app"])
  261.  dict_save.set_current_app_path(res['current_app'])# установит текущий путь к игре.
  262.  box_values = dict_save.return_box_values()  # получить список значения боксов.
  263.  curr_name=dict_save.get_cur_app() # получить значение текущей активной строки.
  264.  key_values = res["key_value"] # получить значения настроек для каждой кнопки мыши.
  265.  
  266.  box_values.clear()# Очистить значения кнопок.
  267.  id_value.set(res["id"])# Установить id устройства в списке.
  268.  dict_save.set_id(res["id"]) #сохранить текущий id устройства
  269.  for i in range(len(LIST_MOUSE_BUTTONS)):  # создания выпадающих списков.
  270.   y1 = (i + 1) * 30 + 1
  271.   box_value = StringVar()
  272.   Label(root, background="#ededed", text=LIST_MOUSE_BUTTONS[i]).place(x=250, y=y1 - 2)
  273.   box = Combobox(root, width=12, textvariable=box_value, values=LIST_KEYS, state='readonly') #
  274.   box.place(x=380, y=y1)
  275.   box_values.append(box_value)
  276.   box.bind('<<ComboboxSelected>>', update_buttons)# Если изменяется значения кнопок
  277.  
  278.  filling_in_fields(res) # заполнения всех полей.
  279.  mouse_check_button(dict_save, res, curr_name) # флаг для удержания кнопки мыши.
  280.  # print("fill")
  281. def move_last_key_to_front(d):
  282.    """
  283.   Рекурсивно перемещает последний ключ словаря в начало.
  284.   Если значение является словарём, функция применяется и к нему.
  285.   """
  286.    # Если d не словарь – возвращаем как есть
  287.    if not isinstance(d, dict):
  288.      return d
  289.  
  290.    keys = list(d.keys())
  291.    if not keys:
  292.      return d
  293.  
  294.    # Сначала обрабатываем последний ключ
  295.    new_d = {keys[-1]: move_last_key_to_front(d[keys[-1]])}
  296.    # Затем остальные ключи в исходном порядке
  297.    for key in keys[:-1]:
  298.      new_d[key] = move_last_key_to_front(d[key])
  299.    return new_d
  300.  
  301. def scrolling_list(event):# прокрутка списка игр.
  302.  a =[]
  303.  labels=dict_save.return_labels()
  304.  for i in range(len(labels)):
  305.    info = labels[i].place_info()
  306.    a.append(int(info["y"]))
  307.  
  308.  var_list = dict_save.return_var_list()
  309.  a = a[1:] + a[:1]  # Перемещаем первый элемент в конец
  310.  for i in range(len(labels)):
  311.    labels[i].place(x=labels[i].winfo_x(), y=a[i])  # Используем winfo_x для получения текущей координаты x
  312.    cb = Checkbutton(root, variable=var_list[i],  # создания галочек
  313.                      onvalue=1, offvalue=0, state=ACTIVE)
  314.    cb.place(x=7, y=a[i] - 2)
  315.  
  316.  res=dict_save.return_jnson()
  317.  
  318.  res = move_last_key_to_front(res)
  319.  #print(res["games_checkmark"])
  320.  dict_save.save_jnson(res)
  321.  
  322. def on_close():# Функция закрытия программы.  # print("exit")
  323.   dict_save.set_default_id_value(add_button_start)
  324.   old_data = dict_save.return_old_data()  # старые значения настроек.
  325.   new_data = dict_save.return_jnson()  # новые значения настроек.
  326.   # print(new_data["key_value"]["C:/Windows/explorer.exe"])
  327.   #print(new_data["games_checkmark"])
  328.   if new_data != old_data or list(old_data["games_checkmark"].keys())[0] != list(new_data["games_checkmark"].keys())[0]:# Если ли какие-то изменения
  329.    if (messagebox.askokcancel("Quit", "Do you want to save the changes?")):
  330.         dict_save.write_to_file(new_data)  # записать настройки в файл.
  331.   dict_save.reset_id_value()
  332.   root.destroy()
  333.   exit()
  334.   sys.exit()
  335. def add_text(key, text_widget):
  336.   # print(key)
  337.   if key == "Левая":
  338.     sc = (f'xte "mousedown 1"\n'  # Нажатие левой кнопки мыши
  339.           f'sleep 0.23\n'  # Удержание 0.3 секунды
  340.           f'xte "mouseup 1"\n')  # Отпускание левой кнопки
  341.   elif key == "Правая":
  342.     sc = (f'xte "mousedown 3"\n'  # Нажатие правой кнопки мыши
  343.           f'sleep 0.23\n'  # Удержание 0.3 секунды
  344.           f'xte "mouseup 3"\n')  # Отпускание правой кнопки
  345.   else:
  346.    sc=(f'xte \"keydown {key}\"\n'
  347.        f'sleep 0.3\n'
  348.        f'xte \"keyup {key}\"\n')
  349.  
  350.   # Вставляем текст в месте курсора
  351.   text_widget.insert(text_widget.index("insert"), sc)
  352.  
  353.   # print(key)
  354. # Создаем главное окно
  355. def keyboard_scrypt(root, text_widget):
  356.   window = Toplevel(root)  # основа
  357.   window.title('Клавиатура')
  358.   window.geometry("1550x320+240+580")  # Используем geometry вместо setGeometry
  359.   keyboard_layout = [
  360.       ['Esc', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12', 'Insert', 'Delete', 'Home',
  361.        'End', 'PgUp', 'PgDn']
  362.       , ['~\n`', '!\n1', '@\n2', '#\n3', '$\n4', '%\n5', '^\n6', '&\n7', '*\n8', '(\n9', ')\n0', '_\n-', '+\n=',
  363.          'Backspace', 'Num Lock', '/', '*', '-']
  364.       , ['Tab', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{\n[', '}\n]', '|\n\\', '7\nHome', '8\n↑', '9\nPgUp',
  365.          '+']
  366.       , ['Caps Lock', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':\n;', '"\n\'', 'Enter', '4\n←', '5\n', '6\n→']
  367.       , ['Shift', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<\n,', '>\n.', '?\n/', 'Shift', '1\nEnd', '2\n↓', '3\nPgDn', 'KEnter']
  368.       , ['Ctrl', 'Windows', 'Alt', 'Space', 'Alt', 'Fn', 'Menu', 'Ctrl', 'up', '0\nIns', '.']
  369.   ]
  370.  
  371.   style = ttk.Style()
  372.   style.configure('TButton', background='lightgray')
  373.   style.map('TButton', background=[('active', 'blue')])
  374.  
  375.   for i, row in enumerate(keyboard_layout):
  376.    for j, key in enumerate(row):
  377.       x1 = 70 * j + 6
  378.       y1 = 50 * i + 6
  379.       if i == 5 and key == "Space":
  380.         button = ttk.Button(window, text=key, width=30, style='TButton',
  381.                             command=lambda k=key, t=text_widget: add_text(k, t))
  382.         button.place(x=x1, y=y1)
  383.       else:
  384.         button = ttk.Button(window, text=key, width=5, style='TButton',
  385.                             command=lambda k=key, t=text_widget: add_text(k, t))
  386.         if key == 'Backspace':  # Условие только для Backspace
  387.             button = ttk.Button(window, text=key, width=10, style='TButton',
  388.                                 command=lambda k=key, t=text_widget: add_text(k, t))
  389.             button.place(x=x1, y=y1)
  390.         elif i == 1 and j > 13:  # Смещение кнопок NumPad после Backspace
  391.             button.place(x=x1 + 80, y=y1)  # Сдвигаем вправо на 80 пикселей
  392.         else:
  393.             button.place(x=x1, y=y1)
  394.         if key in ['7\nHome', '8\n↑', '9\nPgUp', '+']:
  395.             x2 = x1 + 60
  396.             button.place(x=x2, y=y1)
  397.             if key == "+":
  398.                 button.config(text="\n\n" + key + "\n")
  399.         if key in ['4\n←', '5\n', '6\n→']:
  400.             x2 = x1 + 140
  401.             button.place(x=x2, y=y1)
  402.         if key in ['1\nEnd', '2\n↓', '3\nPgDn', 'KEnter']:
  403.             x2 = x1 + 210
  404.             button.place(x=x2, y=y1)
  405.             if key == "KEnter":
  406.                 button.config(text="\n\n" + key + "\n")
  407.         if key in ['0\nIns', '.']:
  408.             x2 = x1 + 420
  409.             button.place(x=x2, y=y1)
  410.         if key in ['Alt_r', 'Fn', 'Menu', 'Ctrl_r']:
  411.             x2 = x1 + 200
  412.             button.place(x=x2, y=y1)
  413.         if key in ['Up']:  # Исправлено с 'up' на 'Up' для соответствия раскладке
  414.             x2 = x1 + 320
  415.             button.place(x=x2, y=y1 - 8)
  416.         if key in ['Left', 'Down', 'Right']:
  417.             x2 = x1 + 810
  418.             button.place(x=x2, y=y1 - 18)
  419.  
  420.   mouse_key_left_button = ttk.Button(window, text="\n\nЛевая\n\n", width=5, style='TButton',
  421.                                      command=lambda k="Левая", t=text_widget: add_text(k, t))
  422.   mouse_key_left_button.place(x=1340, y=100)
  423.   mouse_key_right_button = ttk.Button(window, text="\n\nПравая\n\n", width=5, style='TButton',
  424.                                       command=lambda k="Правая", t=text_widget: add_text(k, t))
  425.   mouse_key_right_button.place(x=1430, y=100)
  426.  
  427.   return window
  428. def run_scrypt(i):
  429.   root.title("Скрипт")
  430.   notebook = ttk.Notebook(root)
  431.   notebook.grid(row=0, column=0, sticky="nsew")
  432.   # Создаем одну вкладку для текста
  433.   tab1 = ttk.Frame(notebook)
  434.   notebook.add(tab1, text="Вкладка 1")
  435.  
  436.   # Добавляем виджет Text на вкладку для ввода текста
  437.   text_widget = Text(tab1, wrap='word')
  438.   text_widget.grid(row=0, column=0, sticky="nsew")
  439.  
  440.   res= dict_save.return_jnson()
  441.   # print(res["script_mouse"])
  442.   if "script_mouse" not in res:
  443.     res.setdefault("script_mouse", {})
  444.   if res["script_mouse"].get(dict_save.get_cur_app()) is None:
  445.     res["script_mouse"].setdefault(dict_save.get_cur_app(), {})
  446.  
  447.   if res["script_mouse"][dict_save.get_cur_app()].get(defaut_list_mouse_buttons[i]) is None:
  448.     res["script_mouse"][dict_save.get_cur_app()].setdefault(defaut_list_mouse_buttons[i], "#!/bin/bash\n")
  449.   key_mouse_scrypt = res["script_mouse"][dict_save.get_cur_app()].get(defaut_list_mouse_buttons[i])
  450.   # print(key_mouse_scrypt)
  451.   if key_mouse_scrypt is not None:
  452.     text_widget.insert("end", key_mouse_scrypt)
  453.   # else:
  454.   #   text_widget.insert("end", "#!/bin/bash\n")
  455.     # Функция для закрытия окна
  456.   def close_window(i, key_mouse_scrypt, win):
  457.     text_content = text_widget.get("1.0", "end-1c")  # Извлекаем текст из text_widget
  458.     res["script_mouse"][dict_save.get_cur_app()][defaut_list_mouse_buttons[i]]=text_content
  459.     dict_save.save_jnson(res)
  460.     notebook.destroy()  # Создаем вкладку с кнопкой "Закрыть"
  461.     win.destroy()
  462.   close_tab = ttk.Frame(notebook)
  463.   notebook.add(close_tab, text="Закрыть")
  464.  
  465.   win= keyboard_scrypt(root, text_widget)
  466.   # Создаем кнопку для закрытия окна на вкладке "Закрыть"
  467.   close_button = ttk.Button(close_tab, text="Закрыть", command=lambda i1=i, key_mouse_scrypt1=key_mouse_scrypt, win1=win
  468.   : close_window(i1, key_mouse_scrypt1, win1))
  469.   close_button.grid(row=0, column=0, sticky="w", pady=10)
  470.  
  471. creat = 0  # Глобальная переменная для контроля создания кнопок
  472. a_scrypt = []  # Список для хранения созданных кнопок
  473.  
  474. def create_scrypt_buttons():
  475.   global creat
  476.   y_place = 23  # Начальная координата для кнопок
  477.   res = dict_save.return_jnson()  # Получение данных из dict_save
  478.   for i in range(7):
  479.     if creat == 0:    # Проверяем, нужно ли создавать кнопки
  480.       scrypt_button = Button( text=str(LIST_MOUSE_BUTTONS[i]),     # Создание кнопки
  481.         font=("Arial", 9),  width=10, height=1,        command=lambda i1=i: run_scrypt(i1)
  482.       )
  483.       scrypt_button.place(x=520, y=y_place)  # Размещение кнопки
  484.       a_scrypt.append(scrypt_button)  # Добавление кнопки в список
  485.  
  486.     # Проверяем состояние кнопки и устанавливаем стиль
  487.     if i < len(a_scrypt) and check_mouse_script(res, dict_save, defaut_list_mouse_buttons, i):      # print("Кнопка активирована")
  488.       a_scrypt[i].config(relief=SUNKEN)  # Изменение стиля кнопки
  489.  
  490.     y_place += 31  # Увеличение координаты по вертикали
  491.  
  492.   creat = 1  # Обновляем флаг, чтобы кнопки не создавались повторно
  493. def delete(dict_save, root):# Удалить профиль.
  494.  if dict_save.get_cur_app()=="C:/Windows/explorer.exe":# # получить id устройства.Если id устройство не выбрали.
  495.      messagebox.showinfo("Ошибка", "Вы выбрали профиль по умолчанию")
  496.      ok_button = Button(root, text="Ок")
  497.      return
  498.  else:
  499.    profile = dict_save.get_cur_app()# Текущая директория активной игры.
  500.    res = dict_save.return_jnson()   # print(profile)
  501.    list_paths=list(res["paths"].keys())
  502.    del_index=(list_paths.index(profile))
  503.    labels = dict_save.return_labels()
  504.    var_list = dict_save.return_var_list()
  505.    for i in range(len(labels)):
  506.      if i == del_index: # индекс какой нужно удалить
  507.       info = labels[i].place_info()
  508.       info2= checkbutton_list[i].place_info()
  509.       old_y = int(info["y"])
  510.  
  511.       old_y2 = int(info2["y"])
  512.      if i > del_index:# индекс больше удалённого
  513.        info = labels[i].place_info()
  514.        new_y = int(info["y"])
  515.        labels[i].place(x=labels[i].winfo_x(), y=old_y)
  516.        old_y=new_y
  517.  
  518.        info2 = checkbutton_list[i].place_info()
  519.        new_y2 = int(info2["y"])
  520.        checkbutton_list[i].place(x=checkbutton_list[i].winfo_x(), y=old_y2)
  521.        old_y2 = new_y2
  522.  
  523.    labels.pop()
  524.    checkbutton_list.pop()
  525.    remove_profile_keys(res, profile)
  526.    del_index= del_index-1
  527.    dict_save.save_jnson(res)  # Сохранить новые настройки.
  528.    check_label_changed(0, labels, del_index, var_list)  # изменение цвета label
  529.    #current_app
  530.    # print(dict_save.return_jnson())
  531.  
  532. def reorder_keys_in_dict(res, index, direction='up'):
  533.   lst = list(res["paths"].keys())
  534.   if direction == 'up' and 0 < index < len(lst):
  535.     lst[index], lst[index - 1] = lst[index - 1], lst[index]
  536.   elif direction == 'down' and 0 <= index < len(lst) - 1:
  537.     lst[index], lst[index + 1] = lst[index + 1], lst[index]
  538.   else:
  539.     return res
  540.   updated_paths = {key: res["paths"][key] for key in lst}
  541.   res["paths"] = updated_paths
  542.   return res
  543. def move_element(dict_save, root, direction='up'):
  544.   """
  545.  Перемещает текущий элемент (определяемый dict_save.get_cur_app())
  546.  вверх или вниз в списке, меняя положение виджетов и порядок ключей в JSON.
  547.  
  548.  :param dict_save: Объект для работы с настройками (с методами get_cur_app, return_jnson, return_labels, set_cur_app, save_jnson)
  549.  :param root: Корневой виджет Tkinter (используется, если требуется)
  550.  :param direction: 'up' для перемещения вверх, 'down' для перемещения вниз
  551.  """
  552.   # Получаем текущий профиль и конфигурацию
  553.   res = dict_save.return_jnson()
  554.   profile = dict_save.get_cur_app()  # Текущая директория/приложение
  555.   list_paths = list(res["paths"].keys())
  556.  
  557.   try:
  558.     index = list_paths.index(profile)
  559.   except ValueError:
  560.     # Если профиль не найден, выходим
  561.     return
  562.   labels = dict_save.return_labels()
  563.  
  564.   # Проверяем границы для перемещения
  565.   if direction == 'up':
  566.     if index == 0:
  567.       return  # Нельзя двигать вверх первый элемент
  568.     new_index = index - 1
  569.   elif direction == 'down':
  570.     if index == len(labels) - 1:
  571.       return  # Нельзя двигать вниз последний элемент
  572.     new_index = index + 1
  573.   else:
  574.     raise ValueError("direction должен быть 'up' или 'down'")
  575.   # Получаем текущие позиции элементов (предполагается, что используется .place())
  576.   info_current = labels[index].place_info()
  577.   info_neighbor = labels[new_index].place_info()
  578.   y_current = int(info_current.get("y", 0))
  579.   y_neighbor = int(info_neighbor.get("y", 0))
  580.   # Меняем местами y-координаты для labels
  581.   labels[index].place(x=labels[index].winfo_x(), y=y_neighbor)
  582.   labels[new_index].place(x=labels[new_index].winfo_x(), y=y_current)
  583.  
  584.   # Меняем порядок элементов в списке labels
  585.   element = labels.pop(index)
  586.   labels.insert(new_index, element)
  587.  
  588.  
  589.   info_current = checkbutton_list[index].place_info()
  590.   info_neighbor = checkbutton_list[new_index].place_info()
  591.   y_current = int(info_current.get("y", 0))
  592.   y_neighbor = int(info_neighbor.get("y", 0))
  593.   # Меняем местами y-координаты для labels
  594.   checkbutton_list[index].place(x=checkbutton_list[index].winfo_x(), y=y_neighbor)
  595.   checkbutton_list[new_index].place(x=checkbutton_list[new_index].winfo_x(), y=y_current)
  596.  
  597.   # Меняем порядок элементов в списке labels
  598.   element = checkbutton_list.pop(index)
  599.   checkbutton_list.insert(new_index, element)
  600.   res =reorder_keys_in_dict(res, index, direction)  # Меняем порядок в списке
  601.   # Обновляем текущий профиль в соответствии с новым порядком
  602.  
  603.   list_paths = list(res["paths"].keys())
  604.   dict_save.set_cur_app(list_paths[new_index])
  605.   # Обновляем цвета: сначала сбрасываем, затем выделяем перемещённый элемент
  606.   set_colol_white_label_changed(labels)
  607.   labels[new_index].config(background="#06c")
  608.   dict_save.save_jnson(res)
  609.  
  610.  
  611.  
  612. dict_save=save_dict()
  613. root = Tk()
  614. id_value =  IntVar()
  615. start_startup = BooleanVar()# запускать при старте.
  616. f1 = Frame()
  617. root.title("Mouse setting control for buttons python")  # заголовок
  618. root.geometry("940x346+440+280")  # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране.
  619. root.configure(bg='DimGray')  # Цвет фона окна
  620. root.resizable(width=False, height=False)
  621. f1.grid(column=0, row=0, padx=10, pady=10)
  622. container = Frame(root)
  623. canvas = Canvas(container,width=700, height=480)
  624. create_scrypt_buttons()
  625. canvas.create_window((0, 0), window=f1, anchor="n")
  626. container.grid()
  627. canvas.grid(sticky=N+W)
  628. scrollbar = Scrollbar(container, orient="vertical", command=canvas.yview)
  629. scrollable_frame = Frame(canvas)
  630. scrollable_frame.bind( "<Configure>",  lambda e: canvas.configure( scrollregion=canvas.bbox("all")    ))
  631. canvas.configure(yscrollcommand=scrollbar.set)
  632. scrollbar.grid(column=0, row=0,sticky=N+S+E)# полоса прокрутки.
  633. scrollbar.bind("<ButtonRelease-1>", lambda event : scrolling_list(event))
  634. add_button_add = Button(text=" Добавить", command= lambda:add_file(dict_save)).grid(column=1, row=0, padx=25, pady=5,sticky=N)
  635. add_button_start = Button(text=" Пуск",  command= lambda:start1(dict_save, root))
  636. add_button_start.place(x=780, y=300)
  637. up_button = Button(text=" Вверх",  command= lambda:move_element(dict_save, root, 'up'))
  638. up_button.place(x=520, y=250)
  639. down_button = Button(text=" Вниз",  command= lambda:move_element(dict_save, root, 'down'))
  640. down_button.place(x=520, y=300)
  641. dict_save.set_add_button_start(add_button_start)
  642. id_list =dict_save.get_list_ids()
  643. start(root, dict_save)
  644. add_button_start = Button(text=" Удалить",  command= lambda:delete(dict_save, root))
  645. add_button_start.place(x=760, y=140)
  646. r1 = Checkbutton(variable=start_startup) # Галочка запускать при старте.
  647. r1.bind("<Button-1>", update_check_button)
  648. CreateToolTip(r1, text='Запускать при открытий')  # вывод надписи
  649. r1.place(x=720, y=105)
  650. root.protocol("WM_DELETE_WINDOW", on_close)
  651.  
  652. process= threading.Thread(target=get_process, args=(dict_save, root,))
  653. process.start()
  654. Button(root, text="Показать список устройств", command=show_list_id_callback).place(x=710, y=220)
  655. if os.getgid() != 0:# if os.getgid() == 0:# start1() с root правами"
  656.  box = Combobox(root, width=12, textvariable=id_value, values=id_list, state='readonly')  #
  657.  box.grid(column=1, row=0, padx=10, pady=60,sticky=N)
  658.  box.bind('<<ComboboxSelected>>', update_buttons)# Если изменяется значения id.
  659.  CreateToolTip(box, text='Выбор id устройства')  # вывод надписи
  660.  if start_startup.get()==True:# Если галочка стоит запускать
  661.   root.iconify()  # Свернуть окно
  662.   # root.withdraw()# свернуть панель подсказок.
  663.   t2 =  threading.Thread(target=start1, args=(dict_save, root, ))
  664.   t2.start()
  665. else:
  666.  show_message()# Создание кнопки "Ок"
  667.  ok_button = Button(root, text="Ок", command=on_close())
  668. root.mainloop()
  669.  
  670. # Get the ID of the main window
  671. main_window_id = root.winfo_id()
  672.  
  673.  
  674.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement