Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from libs_voice import *
- from tkinter import *
- from tkinter.ttk import Combobox # импортируем только то что надо
- from tkinter import messagebox
- from pynput.keyboard import Key, Controller
- from pynput import *
- import keyboard as keybord_from # Управление мышью
- def on_release(key):
- if key == keyboard.Key.shift_l:
- keyb = Controller()
- keyb.press(Key.shift) # отпустить клавишу
- return False
- if key == keyboard.Key.ctrl_r:
- keyb = Controller()
- keyb.press(Key.ctrl_l) # отпустить клавишу
- return False
- if key != keyboard.Key.shift_r and key != keyboard.Key.ctrl and key != keyboard.Key.up \
- and key != keyboard.Key.down and key != keyboard.Key.left and key != keyboard.Key.right:
- keyb = Controller()
- keyb.release(Key.shift)
- keyb.release(Key.ctrl_l)
- return False
- KEYS = {" ": 0x0,"LBUTTON": 'mouse left', "RBUTTON": 'mouse right', "WHEEL_MOUSE_BUTTON": "mouse middle",
- "WHEEL_MOUSE_UP" : "WHEEL_MOUSE_UP", "MBUTTON": 0x04, "SCROLL_UP": "scroll_up",
- "SCROLL_DOWN" : "scroll_down", "XBUTTON1": 0x05, "XBUTTON2": 0x06, "BACKSPACE": "BackSpace",
- "TAB": "Tab", "CLEAR": 0x0C, "RETURN": "Return", "KP_Enter" : "KP_Enter",
- "SHIFT": 0x10, "CONTROL": 0x11, "MENU": 0x12, "PAUSE": 0x13, "CAPITAL": 0x14,
- "KANA": 0x15, "JUNJA": 0x17, "FINAL": 0x18, "KANJI": 0x19, "ESCAPE": 0x1B,
- "CONVERT": 0x1C, "NONCONVERT": 0x1D, "ACCEPT": 0x1E, "MODECHANGE": 0x1F, "SPACE": "space",
- "PRIOR": 0x21, "NEXT": 0x22, "END": "0x23", "HOME": "Home", "LEFT": 0x25, "UP": 0x26,
- "RIGHT": 0x27, "DOWN": 0x28, "SELECT": 0x29, "PRINT": 0x2A, "EXECUTE": 0x2B, "SNAPSHOT": 0x2C,
- "INSERT": 0x2D, "DELETE": "Delete", "HELP": 0x2F, "LWIN": "Super_L", "RWIN": "Super_R",
- "KEY0": 0, "KEY1": 1, "KEY2": 2, "KEY3": 3, "KEY4": 4, "KEY5": 5, "KEY6": 6,
- "KEY7": 7, "KEY8": 8, "KEY9": 9, "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": "Q", "R": "R", "S": "S", "T": "T", "U": "U", "V": "V", "W": "W", "X": "X", "Y": "Y",
- "Z": "Z",
- "APPS": 0x5D, "SLEEP": 0x5F, "NUMPAD0": 0x60, "NUMPAD1": 79,
- "NUMPAD2": 80, "NUMPAD3": 81, "NUMPAD4": 82, "NUMPAD5": 83, "NUMPAD6": 84, "NUMPAD7": 85,
- "NUMPAD8": 86, "NUMPAD9": 87, "MULTIPLY": 0x6A, "ADD": 78, "SEPARATOR": 0x6C, "SUBTRACT": 0x6D,
- "DECIMAL": 0x6E, "DIVIDE": 0x6F, "F1": "F1", "F2": "F2", "F3": "F3", "F4": "F4", "F5": "F5",
- "F6": "F6", "F7": "F7", "F8": "F8", "F9": "F9", "F10": "F10", "F11": "F11", "F12": "F12",
- "F13": 0x7C, "F14": 0x7D, "F15": 0x7E, "F16": 0x7F, "F17": 0x80, "F18": 0x81, "F19": 0x82, "F20": 0x83, "F21": 0x84,
- "F22": 0x85, "F23": 0x86, "F24": 0x87,"NUMLOCK": "Num_Lock", "SCROLL": "Scroll_Lock",
- "OEM_FJ_JISHO": 0x92, "OEM_FJ_MASSHOU": 0x93,
- "OEM_FJ_TOUROKU": 0x94, "OEM_FJ_LOYA": 0x95, "OEM_FJ_ROYA": 0x96, "LSHIFT": "Shift_L", "RSHIFT": "Shift_R", "LCONTROL": "ISO_Next_Group",
- "RCONTROL": "Control_R", "LMENU": 0xA4, "RMENU": 0xA5, "BROWSER_BACK": 0xA6,
- "BROWSER_FORWARD": 0xA7, "BROWSER_REFRESH": 0xA8, "BROWSER_STOP": 0xA9, "BROWSER_SEARCH": 0xAA, "BROWSER_FAVORITES": 0xAB, "BROWSER_HOME": 0xAC, "VOLUME_MUTE": 0xAD, "VOLUME_DOWN": 0xAE,
- "VOLUME_UP": 0xAF, "MEDIA_NEXT_TRACK": 0xB0, "MEDIA_PREV_TRACK": 0xB1, "MEDIA_STOP": 0xB2, "MEDIA_PLAY_PAUSE": 0xB3, "LAUNCH_MAIL": 0xB4, "LAUNCH_MEDIA_SELECT": 0xB5, "LAUNCH_APP1": 0xB6,
- "LAUNCH_APP2": 0xB7, "OEM_1": 0xBA, "OEM_PLUS": 0xBB, "OEM_COMMA": 0xBC, "OEM_MINUS": 0xBD, "OEM_PERIOD": 0xBE, " OEM_2": 0xBF, "OEM_3": 0xC0, "ABNT_C1": 0xC1, "ABNT_C2": 0xC2, "OEM_4": 0xDB,
- "OEM_5": 0xDC, "OEM_6": 0xDD, "OEM_7": 0xDE, "OEM_8": 0xDF, "OEM_AX": 0xE1,
- "OEM_102": 0xE2, "ICO_HELP": 0xE3, "PROCESSKEY": 0xE5, "ICO_CLEAR": 0xE6, "PACKET": 0xE7, "OEM_RESET": 0xE9, "OEM_JUMP": 0xEA, "OEM_PA1": 0xEB, "OEM_PA2": 0xEC, "OEM_PA3": 0xED,
- "OEM_WSCTRL": 0xEE, "OEM_CUSEL": 0xEF, "OEM_ATTN": 0xF0, "OEM_FINISH": 0xF1, "OEM_COPY": 0xF2, "OEM_AUTO": 0xF3, "OEM_ENLW": 0xF4, "OEM_BACKTAB": 0xF5, "ATTN": 0xF6, "CRSEL": 0xF7, "EXSEL": 0xF8, " EREOF": 0xF9, "PLAY": 0xFA, "ZOOM": 0xFB, "PA1": 0xFD, " OEM_CLEAR": 0xFE
- }
- def check(driver):
- url = driver.current_url
- driver.implicitly_wait(3)
- try:
- return 0
- except Exception as ex:
- check(driver)
- class work_key:
- def __init__(self):
- self.keys_list = ["1", "2", "3", "4",'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g',
- 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'BackSpace', 'Tab', 'Return', 'KP_Enter', 'Escape', 'Delete', 'Home', 'End', 'Page_Up',
- 'Page_Down', 'F1', 'Up', 'Down', 'Left', 'Right', 'Control_L', 'ISO_Next_Group', 'Control_R', 'Shift_L', 'Shift_R', 'Alt_L', 'Alt_R', 'Super_L',
- 'Super_R', 'Caps_Lock', 'Num_Lock', 'Scroll_Lock', 'space', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12']
- def mouse_wheel_up(self): #
- mouse_wheel = '''#!/bin/bash
- xdotool click {0} '''.format(4)
- subprocess.call(['bash', '-c', mouse_wheel])
- def mouse_wheel_donw(self): #
- mouse_wheel = '''#!/bin/bash
- xdotool click {0} '''.format(5)
- subprocess.call(['bash', '-c', mouse_wheel])
- def mouse_right_donw(self): #
- mouse_wheel = '''#!/bin/bash
- xdotool click {0} '''.format(3)
- subprocess.call(['bash', '-c', mouse_wheel])
- def mouse_middle_donw(self): #
- mouse_wheel = '''#!/bin/bash
- xdotool click {0} '''.format(2)
- subprocess.call(['bash', '-c', mouse_wheel])
- def key_press(self, key, number_key = 0):# Нажать.
- if key in self.keys_list:
- key=key
- if key.upper() in ['F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12']:
- key=key.upper() # print(key)
- press = '''#!/bin/bash
- xte \"keydown {0}\"
- sleep 0.3
- xte \"keyup {0}\"'''.format(key)
- subprocess.call(['bash', '-c', press])
- return 0
- def prease_on_key(driver, d): #
- pres12= work_key()
- timestamp = time.time()
- while 1:
- try:
- text = driver.find_element(By.ID, "speech-text").text
- text = str(text).lower()
- if len(text) != 0 and text != None: # print(text)
- for key in d:
- word1=str(d[key])
- words=word1.rsplit(",")
- x=[ i.lstrip() for i in words]
- for word1 in x:
- word= str(word1).lower()
- if word == text:
- key1=key.upper()
- key2=str(KEYS[key1]).lower()
- driver.find_element("id", "mic").click()
- pres12.key_press(key2)
- time.sleep(0.5)
- # driver.find_element("class","p_edit dir_LTR").clear() # удалить старый текст.
- driver.find_element("id", "mic").click()
- if time.time() - timestamp > 10: # print(time.time())
- driver.find_element("id", "mic").click()
- time.sleep(0.35)
- driver.find_element("id", "mic").click() #
- timestamp = time.time()
- except Exception as ex:
- # print(ex)
- pass
- def web():
- option = get_option() # Включить настройки.# option.add_argument("--headless") # Включение headless-режима
- try:
- driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=option)
- driver.set_window_position(600, 650)
- driver.set_window_size(624, 368) # optiol
- driver.get("https://www.speechtexter.com")# открыть сайт
- check(driver)
- driver.minimize_window()
- driver.find_element("id", "mic").click()# включить запись голоса
- return driver
- except Exception as ex: #print(ex)
- pass
- finally:
- pass
- # добавление нового элемента
- list_profiles = ["default"] # список профилей.
- def start_voice():
- try:
- driver = web()# запуск браузер.
- d = {}
- for i in range(len(arg)):
- value = (str(arg[i].get()))
- key = str(values[i].get())
- d[key] = value
- try:
- if key == "":
- messagebox.showerror("Erorr", "key emrty")
- dict_save.kill_chromedrive_id() # Убить текущей процесс.
- break
- return
- if value == "":
- messagebox.showerror("Erorr", "Value emrty")
- dict_save.kill_chromedrive_id() # Убить текущей процесс.
- break
- return
- except Exception as ex:
- pass
- app_thread = threading.Thread(target=prease_on_key, args=(driver, d,))
- app_thread.start()
- except Exception as ex:
- pass
- class save_dict:
- def __init__(self):
- self.d = {}
- self.jnson = {}
- def add_dict(self, second_dict):
- self.d= self.d | second_dict
- def return_dict(self):
- return self.d
- def save_jnson(self, jn):
- self.jnson= jn
- def return_jnson(self):
- return self.jnson
- def save_keys_and_values(event=0):
- d,d1={},{}
- d=dict_save.return_jnson()# старый словарь.
- d["last_pfofile"]=str(profile_current.get())
- d["start_startup"]=start_startup.get()
- d1=d["profiles"]
- d=d1[str(profile_current.get())]
- d.clear()
- for i in range(len(arg)):
- key = str(arg[i].get())
- value = str(values[i].get())
- d[key]=value# обновления словаря.
- d1[str(profile_current.get())]=d
- def on_close():
- new_data={"last_pfofile" : profile_current.get(),
- "profiles" : dict_save.return_dict()} # новые значения настроек.
- old_data= dict_save.return_jnson()# старые значения настроек.
- if new_data != old_data:
- if messagebox.askokcancel("Quit", "Do you want to save the changes?"):
- json_string = json.dumps(new_data, ensure_ascii=False, indent=2)
- with open("settings volce game contol for linux.json", "w", encoding="cp1251") as w:
- w.write(json_string)# сохранить изменения в файле настроек.
- root.destroy()
- # удаления записи и значения.
- def remove_box_and_entry(ent_arr, box_arr):
- if len(values)>0:
- r = len(arg)
- values[r-1].set("")
- arg[r-1].set("")
- ent_arr[r-1].destroy()
- box_arr[r-1].destroy()
- ent_arr.pop()
- box_arr.pop()
- values.pop()
- arg.pop()
- return ent_arr, box_arr
- else:
- return ent_arr, box_arr
- class iter_counter:
- def __init__(self):
- self._value = -1
- self.box_arr = []
- self.ent_arr = []
- def add_new_command(self, scrollable_frame, entry_value=0, box_value=0):
- self._value += 1
- value= self._value # print(value)
- a = list(KEYS.keys()), arg.append(StringVar()), values.append(StringVar())
- entry = Entry(scrollable_frame, width=17, textvariable=arg[value]) # текстовое поле и кнопка для добавления в список
- entry.grid(column=0, row=value+1, padx=(3, 0), pady=8)
- box = Combobox(scrollable_frame, width=10, textvariable=values[value], values=a[0])
- box.grid(column=1, row=value+1, padx=38, pady=0) # поле со списком
- key=str(profile_current.get())
- if entry_value != 0 and box_value != 0:
- arg[value].set(entry_value)
- values[value].set(box_value)
- else:
- arg[value].set("")
- values[value].set("")
- return self.ent_arr.append(entry), self.box_arr.append(box),self._value,
- def del_command(self):
- value = self._value
- ent_arr, box_arr= self.box_arr, self.ent_arr
- ent_arr, box_arr=remove_box_and_entry(ent_arr, box_arr)
- self._value -= 1
- return self._value, self.box_arr, self.ent_arr
- def remove_all_command(self, scrollable_frame):
- self._value=-1
- ent_arr, box_arr, value = self.box_arr, self.ent_arr, self._value
- for i in range(len(box_arr)):
- ent_arr, box_arr = remove_box_and_entry(ent_arr, box_arr)
- new.add_new_command(scrollable_frame)
- return self._value, self.box_arr, self.ent_arr
- def remove_all_command_without_adding(self):
- value = self._value
- ent_arr, box_arr= self.box_arr, self.ent_arr
- for i in range(len(box_arr)):
- ent_arr, box_arr = remove_box_and_entry(ent_arr, box_arr)
- self._value=-1
- return self._value, self.box_arr, self.ent_arr
- def filling_fields(dict_save, last_pfofile):
- d=dict_save.return_dict()# получить словарь со всеми значениями.
- for k, v in d.items():
- if k not in list_profiles:
- list_profiles.append(k)
- if k== last_pfofile:
- for k1, v1 in v.items():
- v1=v[k1]
- new.add_new_command(scrollable_frame,k1,v1)
- def update(event):
- d=dict_save.return_dict()
- d=d[str(profile_current.get())]
- new.remove_all_command_without_adding()
- filling_fields(dict_save, profile_current.get())
- def c(event):
- d=dict_save.return_dict()
- d=d[str(profile_current.get())]
- for i in range(len(arg) - 1):
- key = str(arg[i].get())
- value = str(values[i].get())
- d[key]=value
- d1=dict_save.return_dict()
- d1[str(profile_current.get())]=d
- return 0
- def create_box():
- box = Combobox(root, width=10, textvariable=profile_current, values=list_profiles, state='readonly')
- box.grid(column=1, row=0, padx=3, pady=0) # поле со списком.
- box.bind('<Button-1>', c) # при нажатии на выпадающий список.
- box.bind('<<ComboboxSelected>>', update)# при изменения профиля.
- return box
- def add1(root,window, new, scrollable_frame):
- value= new_profile.get()
- if value != '':
- list_profiles.append(str(value))
- box = Combobox(root, width=10, textvariable=profile_current, values=list_profiles, state='readonly')
- box.bind('<<ComboboxSelected>>', update)
- box.grid(column=1, row=0, padx=3, pady=0) # поле со списком
- add_button = Button(text="Добавить профиль", command= lambda:add_new_profile(root, box)).grid(column=2, row=0, padx=10, pady=6)
- box.current(len(list_profiles)-1)
- window.destroy()
- new_profile.set('')
- new.remove_all_command(scrollable_frame)
- def add_new_profile(root,box,new,scrollable_frame):
- window = Toplevel(root)# основа
- window.title("add new profile") # заголовок
- window.geometry("500x150+750+400") # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране.
- window.configure(bg='DimGray') # Цвет фона окна
- e=Entry(window, width=30, textvariable=new_profile) #строка ввода профиля.
- e.grid(column=2, row=0, padx=50, pady=5)
- e.focus_set()
- Button(window, text="Добавить профиль", command= lambda:add1(root,window,new,scrollable_frame))\
- .grid(column=2, row=1, padx=50, pady=30) # кнопка добавить профиль, откроется новое окно.
- def start(new, scrollable_frame,box):
- data ="settings volce game contol for linux.json" # файл настроек.
- if os.path.exists(data): # есть ли этот файл.
- with open(data, encoding='windows-1251') as json_file:
- res= json.load(json_file)
- start_startup.set(res["start_startup"])
- dict_save.save_jnson(res)# соранить начальные настройки.
- last_pfofile = res['last_pfofile'] # последний исполь профиль.
- if not last_pfofile in list_profiles:
- list_profiles.append(last_pfofile)
- box =create_box() # Создания выпадающего списка.
- box.current(len(list_profiles) - 1)
- d=res['profiles']
- dict_save.add_dict(d)
- filling_fields(dict_save, last_pfofile)# запол полей
- else:
- new.add_new_command(scrollable_frame)
- def delayed_launch(start_startup):
- if start_startup.get(): # Запуск при открытий.
- start_voice()
- dict_save=save_dict()
- root = Tk()
- root.geometry("680x250+650+400")
- profile_current, new_profile=StringVar(),StringVar()
- start_startup = BooleanVar()
- lb = Label(root, text="Голосовое управления в играх",width=28).grid(column=0, row=0) # текстовое поле и кнопка для добавления в список
- arg, values = [], []# списки для слов и значений.
- container = Frame(root)
- canvas = Canvas(container,width=320, height=200)
- scrollbar = Scrollbar(container, orient="vertical", command=canvas.yview)
- scrollable_frame = Frame(canvas)
- scrollable_frame.bind( "<Configure>",
- lambda e: canvas.configure( scrollregion=canvas.bbox("all")
- ))
- canvas.create_window((0, 0), window=scrollable_frame, anchor="n")
- canvas.configure(yscrollcommand=scrollbar.set)
- container.grid()
- canvas.grid(sticky=N+S)
- scrollbar.grid(column=0, row=0,sticky=N+S+E)# полоса прокрутки.
- box = create_box() # Создания выпадающего списка.
- new=iter_counter()# объект класса.
- add_button = Button(text="Добавить профиль", command= lambda:add_new_profile(root, box, new,scrollable_frame))\
- .grid(column=2, row=0, padx=10, pady=6)
- add_key_button = Button(text="Добавить команду", command= lambda:new.add_new_command(scrollable_frame))\
- .grid(column=1, row=1, padx=1, pady=30,sticky=N)
- del_key_button_1 = Button(text="Удалить команду", command= lambda:new.del_command())\
- .grid(column=1, row=1,padx=1,pady=90,sticky=N)
- go_button_2 = Button(text=" Старт ", command= lambda:start_voice())\
- .grid(column=2, row=1,padx=0,pady=20,sticky=SE)# Запуск управления.
- root.protocol("WM_DELETE_WINDOW", on_close)
- box.grid(column=1, row=0, padx=3, pady=0) # поле со списком
- start(new, scrollable_frame,box)# запуск всего.
- r1 = Checkbutton(text='Запускать при открытий', variable=start_startup, command=lambda:save_keys_and_values())
- r1.place(x=323, y=190)
- t2 = threading.Thread(target=delayed_launch, args=(start_startup,))
- t2.start()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement