Advertisement
egor230

voice control in the game

Apr 20th, 2022 (edited)
744
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 21.27 KB | Gaming | 0 0
  1. from tkinter import *
  2. from tkinter.ttk import Combobox  # импортируем только то что надо
  3. from tkinter import messagebox
  4. import json, os, time, copy, ctypes, subprocess, psutil
  5. import keyboard as keyb
  6. from selenium import webdriver
  7. from selenium.webdriver.common.keys import Keys
  8. from selenium.webdriver.chrome.options import Options
  9. from selenium.webdriver.chrome.service import Service
  10. from threading import *
  11. import pydirectinput as pyinput
  12.  
  13. from deepdiff import DeepDiff
  14.  
  15. data = "settings for voice control in the game.json"  # файл настроек.
  16. KEYS = {"LBUTTON": 0x01, "RBUTTON": 0x02, "WHEEL_MOUSE_BUTTON": 0x03, "MBUTTON": 0x04, "XBUTTON1": 0x05,
  17.               "XBUTTON2": 0x06, "BACK": 0x08, "TAB": 0x09, "CLEAR": 0x0C, "RETURN": 0x0D,
  18.               "SHIFT": 0x10, "CONTROL": 0x11, "MENU": 0x12, "PAUSE": 0x13, "CAPITAL": 0x14,
  19.               "KANA": 0x15, "JUNJA": 0x17, "FINAL": 0x18, "KANJI": 0x19, "ESCAPE": 0x1B,
  20.               "CONVERT": 0x1C, "NONCONVERT": 0x1D, "ACCEPT": 0x1E, "MODECHANGE": 0x1F, "SPACE": 0x20,
  21.               "PRIOR": 0x21, "NEXT": 0x22, "END": 0x23, "HOME": 0x24, "LEFT": 0x25, "UP": 0x26,
  22.               "RIGHT": 0x27, "DOWN": 0x28, "SELECT": 0x29, "PRINT": 0x2A, "EXECUTE": 0x2B,
  23.               "SNAPSHOT": 0x2C, "INSERT": 0x2D, "DELETE": 0x2E, "HELP": 0x2F, "KEY0": 0x30,
  24.               "KEY1": 0x31, "KEY2": 0x32, "KEY3": 0x33, "KEY4": 0x34, "KEY5": 0x35, "KEY6": 0x36,
  25.               "key7": 0x37, "KEY8": 0x38, "KEY9": 0x39, "A": 0x41, "B": 0x42, "C": 0x43, "D": 0x44,
  26.               "E": 0x45, "F": 0x46, "G": 0x47, "H": 0x48, "I": 0x49,
  27.               "J": 0x4A, "K": 0x4B, "L": 0x4C, "M": 0x4D, "N": 0x4E, "O": 0x4F, "P": 0x50, "Q": 0x51, "R": 0x52,
  28.               "S": 0x53, "T": 0x54, "U": 0x55, "V": 0x56, "W": 0x57, "X": 0x58, "Y": 0x59,
  29.               "Z": 0x5A, "LWIN": 0x5B, "RWIN": 0x5C, "APPS": 0x5D, "SLEEP": 0x5F, "NUMPAD0": 0x60, "NUMPAD1": 0x61,
  30.               "NUMPAD2": 0x62, "NUMPAD3": 0x63, "NUMPAD4": 0x64, "NUMPAD5": 0x65,
  31.               "NUMPAD6": 0x66, "NUMPAD7": 0x67, "NUMPAD8": 0x68, "NUMPAD9": 0x69, "MULTIPLY": 0x6A, "ADD": 0x6B,
  32.               "SEPARATOR": 0x6C, "SUBTRACT": 0x6D, "DECIMAL": 0x6E, "DIVIDE": 0x6F, "F1": 0x70, "F2": 0x71,
  33.               "F3": 0x72, "F4": 0x73, "F5": 0x74, "F6": 0x75, "F7": 0x76, "F8": 0x77, "F9": 0x78, "F10": 0x79,
  34.               "F11": 0x7A, "F12": 0x7B, "F13": 0x7C, "F14": 0x7D,
  35.               "F15": 0x7E, "F16": 0x7F, "F17": 0x80, "F18": 0x81, "F19": 0x82, "F20": 0x83, "F21": 0x84,
  36.               "F22": 0x85, "F23": 0x86, "F24": 0x87, "NUMLOCK": 0x90, "SCROLL": 0x91, "OEM_FJ_JISHO": 0x92, "OEM_FJ_MASSHOU": 0x93,
  37.               "OEM_FJ_TOUROKU": 0x94, "OEM_FJ_LOYA": 0x95, "OEM_FJ_ROYA": 0x96, "LSHIFT": 0xA0, "RSHIFT": 0xA1, "LCONTROL": 0xA2,
  38.               "RCONTROL": 0xA3, "LMENU": 0xA4, "RMENU": 0xA5, "BROWSER_BACK": 0xA6,
  39.               "BROWSER_FORWARD": 0xA7, "BROWSER_REFRESH": 0xA8, "BROWSER_STOP": 0xA9, "BROWSER_SEARCH": 0xAA, "BROWSER_FAVORITES": 0xAB, "BROWSER_HOME": 0xAC, "VOLUME_MUTE": 0xAD, "VOLUME_DOWN": 0xAE,
  40.               "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,
  41.               "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,
  42.               "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,
  43.               "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
  44.               }
  45.  
  46. def check(driver):
  47.   url = driver.current_url
  48.   driver.implicitly_wait(3)
  49.   try:
  50.     return 0
  51.   except Exception as ex:
  52.     check(driver)
  53. class save_dict:
  54.     def __init__(self):
  55.         self.jnson = {}
  56.         self.old_data = {}
  57.         self.chrome_pid = 0# id процесса chrome
  58.         self. chrome_processes = [] # список всех процессов Chrome
  59.         self.driver=0
  60.     def save_old_data(self, jnson):
  61.       self.old_data= copy.deepcopy(jnson)
  62.  
  63.     def save_jnson(self, jn):
  64.        self.jnson= jn
  65.  
  66.     def return_jnson(self):
  67.        return self.jnson
  68.  
  69.     def return_old_data(self):
  70.        return self.old_data
  71.  
  72.     def write_to_file(self, new_data):
  73.      json_string = json.dumps(new_data, ensure_ascii=False, indent=2)
  74.      with open(data, "w", encoding="cp1251") as w:
  75.        w.write(json_string)  # сохранить изменения в файле настроек.
  76.      return self
  77.     def find_chromedrive(self): # Поиск всех процессов Chrome
  78.       for proc in psutil.process_iter():
  79.        try:
  80.          if 'chromedriver' in proc.name():
  81.           self.chrome_processes.append(proc.pid)
  82.        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
  83.          pass
  84.     def define_chromedrive_id(self, driver):# определить id текущего chromedriver.
  85.      self.driver=driver
  86.      for proc in psutil.process_iter():
  87.        try:
  88.         if 'chromedriver' in proc.name() and proc.pid not in self.chrome_processes:
  89.          self.chrome_pid=proc.pid
  90.        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
  91.          pass
  92.     def kill_chromedrive_id(self):
  93.      if self.chrome_pid > 0:
  94.       for proc in psutil.process_iter():
  95.         if proc.pid ==self.chrome_processes:
  96.          process = psutil.Process(proc.pid)
  97.          process.terminate() # Завершение текущего id процесса chromedriver.
  98.          # print(self.chrome_pid)
  99.         if 'chrome' in proc.name():
  100.          process = psutil.Process(proc.pid)
  101.          process.terminate()
  102.      # self.driver.close()
  103.      # self.driver.quit()
  104. def prease_on_key(driver, d):
  105.  
  106.  timestamp = time.time()
  107.  while 1:
  108.     try:
  109.      time.sleep(0.65)
  110.      # driver.find_element("class","p_edit dir_LTR").clear()  # удалить старый текст.
  111.  
  112.      text = driver.find_element("id", "speech-display").text
  113.      text = str(text)
  114.      if len(text) != 0 and text != None:
  115.        text = str(text).lower()
  116.        for key in d:
  117.         word1=str(d[key])
  118.         words=word1.rsplit(",")
  119.         x=[ i.lstrip() for i in words]
  120.         for word1 in x:
  121.           word= str(word1).lower()
  122.           if word == text:
  123.              key1=key.upper()
  124.              key2=KEYS[key1]
  125.              driver.find_element("id", "mic").click()
  126.              pyinput.keyDown(str(key1).replace("KEY","").lower())
  127.              time.sleep(0.35)
  128.              pyinput.keyUp(str(key1).replace("KEY","").lower())
  129.              driver.find_element("id","mic").click()#
  130.              timestamp = time.time()
  131.  
  132.              break
  133.      if time.time() - timestamp > 10:
  134.      #      print(time.time())
  135.           driver.find_element("id", "mic").click()
  136.           time.sleep(0.35)
  137.           driver.find_element("id","mic").click()#
  138.           timestamp = time.time()
  139.     except Exception as ex:
  140.        # print(ex)
  141.        pass
  142. def web():
  143.  
  144.     options = Options()
  145.     home =r"C:\Program Files (x86)\Google\Chrome"
  146.     options.add_argument("--use-fake-ui-for-media-stream")# звук
  147.     options.add_experimental_option("excludeSwitches", ['enable-automation']) # убрать окно
  148.     options.binary_location = home +r"\Application\chrome.exe"
  149.     options.add_argument(r"--user-data-dir=C:\Users\egor\AppData\Local\Google\Chrome\User Data")
  150.     options.add_argument("--disable-extensions")  # отключить расширения.
  151.     dict_save.find_chromedrive() # Поиск всех процессов Chrome
  152.     try:
  153.       s = Service(home + r'\chromedriver\chromedriver.exe')
  154.       driver = webdriver.Chrome(service=s, options=options)
  155.       driver.set_window_position(600, 650)
  156.       driver.set_window_size(624, 368) # optiol
  157.       dict_save.define_chromedrive_id(driver) # определить id текущего chromedriver.
  158.       driver.get("https://www.speechtexter.com")# открыть сайт
  159.       check(driver)
  160.       driver.find_element("id", "mic").click() # включить запись голоса
  161.       driver.minimize_window()
  162.  
  163.       return driver
  164.  
  165.     except Exception as ex:
  166.        # print(ex)
  167.        dict_save.kill_chromedrive_id()
  168.        pass
  169.     finally:
  170.        pass
  171. # добавление нового элемента
  172. list_profiles = ["default"]  # список профилей.
  173.  
  174. def start_voice():
  175.  
  176.   user32 = ctypes.WinDLL('user32', use_last_error=True)
  177.   curr_window = user32.GetForegroundWindow()
  178.   thread_id = user32.GetWindowThreadProcessId(curr_window, 0)
  179.   klid = user32.GetKeyboardLayout(thread_id)
  180.   if klid == 68748313: # приключения на английский раскладку.
  181.    keyb.press_and_release('win+space')  # subprocess.run(["powershell.exe", "-Command", "& Set-WinUserLanguageList -LanguageList '+en-EN+' -Force}"])
  182.   driver = web()# запуск браузер.
  183.   d={}
  184.   for i in range(len(arg)):
  185.     value=(str(arg[i].get()))
  186.     key= str(values[i].get())
  187.     d[key]=value
  188.     try:
  189.         if key=="":
  190.             messagebox.showerror("Erorr","key emrty")
  191.             dict_save.kill_chromedrive_id()# Убить текущей процесс.
  192.             break
  193.             return
  194.         if value == "":
  195.            messagebox.showerror("Erorr", "Value emrty")
  196.            dict_save.kill_chromedrive_id()# Убить текущей процесс.
  197.            break
  198.            return
  199.     except Exception as ex:
  200.             pass
  201.  
  202.  
  203.   t1 = Thread(target = prease_on_key, args =(driver, d,))
  204.   t1.start()
  205.  
  206.  
  207. def save_keys_and_values(event=0):
  208.  d,d1={},{}
  209.  d=dict_save.return_jnson()# старый словарь.
  210.  d["last_pfofile"]=str(profile_current.get())
  211.  d["start_startup"]=start_startup.get()
  212.  d1=d["profiles"]
  213.  d=d1[str(profile_current.get())]
  214.  d.clear()
  215.  for i in range(len(arg)):
  216.         key = str(arg[i].get())
  217.         value = str(values[i].get())
  218.         d[key]=value# обновления словаря.
  219.  d1[str(profile_current.get())]=d
  220.  
  221. def on_close():
  222.     dict_save.kill_chromedrive_id()# Убить текущей процесс.
  223.     save_keys_and_values()
  224.  
  225.     old_data =dict_save.return_old_data()# старые значения настроек.
  226.     new_data= dict_save.return_jnson() # новые значения настроек.
  227.     d= old_data['profiles']
  228.     n = new_data['profiles']
  229.     diff = DeepDiff(d, n) # res=(dict(diff))  # print(new_data)   # print(old_data)
  230.     if new_data != old_data:   # if old_data['profiles'] != new_data['profiles'] :
  231.      if (messagebox.askokcancel("Quit", "Do you want to save the changes?")):
  232.          dict_save.write_to_file(new_data)# записать настройки в файл.
  233.      else:
  234.        pass
  235.     # else:
  236.     #     dict_save.write_to_file(new_data) # записать настройки в файл.
  237.     root.destroy()
  238.  
  239. # удаления записи и значения.
  240. def remove_box_and_entry(ent_arr, box_arr):
  241.  if len(values)>0:
  242.     r = len(arg)
  243.     values[r-1].set("")
  244.     arg[r-1].set("")
  245.     ent_arr[r-1].destroy()
  246.     box_arr[r-1].destroy()
  247.     ent_arr.pop()
  248.     box_arr.pop()
  249.     values.pop()
  250.     arg.pop()
  251.     return ent_arr, box_arr
  252.  else:
  253.     return ent_arr, box_arr
  254.  
  255. class iter_counter:
  256.   def __init__(self):
  257.      self._value = -1
  258.      self.box_arr = []
  259.      self.ent_arr = []
  260.   def add_new_command(self, scrollable_frame, entry_value=0, box_value=0):
  261.         self._value += 1
  262.         value= self._value  # print(value)
  263.         a = list(KEYS.keys()), arg.append(StringVar()), values.append(StringVar())
  264.         entry = Entry(scrollable_frame, width=25,textvariable=arg[value])  # текстовое поле и кнопка для добавления в список
  265.         entry.grid(column=0, row=value+1, padx=10, pady=8, sticky=W)
  266.         box = Combobox(scrollable_frame, width=12, textvariable=values[value], values=a[0])
  267.         box.grid(column=1, row=value+1, padx=22, pady=0)  # поле со списком
  268.         key=str(profile_current.get())
  269.         if entry_value != 0 and box_value != 0:
  270.             arg[value].set(entry_value)
  271.             values[value].set(box_value)
  272.         else:
  273.             arg[value].set("")
  274.             values[value].set("")
  275.         return self.ent_arr.append(entry), self.box_arr.append(box),self._value,
  276.   def del_command(self):
  277.        value = self._value
  278.        ent_arr, box_arr= self.box_arr, self.ent_arr
  279.        ent_arr, box_arr=remove_box_and_entry(ent_arr, box_arr)
  280.  
  281.        self._value -= 1
  282.        return self._value, self.box_arr, self.ent_arr
  283.   def remove_all_command(self, scrollable_frame):
  284.        self._value=-1
  285.        ent_arr, box_arr, value = self.box_arr, self.ent_arr, self._value
  286.        for i in range(len(box_arr)):
  287.         ent_arr, box_arr = remove_box_and_entry(ent_arr, box_arr)
  288.        new.add_new_command(scrollable_frame)
  289.        return self._value, self.box_arr, self.ent_arr
  290.   def remove_all_command_without_adding(self):
  291.        value = self._value
  292.        ent_arr, box_arr= self.box_arr, self.ent_arr
  293.        for i in range(len(box_arr)):
  294.         ent_arr, box_arr = remove_box_and_entry(ent_arr, box_arr)
  295.        self._value=-1
  296.        return self._value, self.box_arr, self.ent_arr
  297.  
  298. def filling_fields(dict_save, last_pfofile):# Заполнения полей.
  299.    d=dict_save.return_jnson()# получить словарь со всеми значениями.
  300.    d=d["profiles"]
  301.    for k, v in d.items():
  302.        if k not in list_profiles:
  303.          list_profiles.append(k)
  304.        if k== last_pfofile:
  305.         for k1, v1 in v.items():
  306.          v1=v[k1]
  307.          new.add_new_command(scrollable_frame,k1,v1)
  308.  
  309.  
  310. def update(event):
  311.     new.remove_all_command_without_adding()
  312.     filling_fields(dict_save, profile_current.get())
  313.  
  314. def create_box():
  315.     box = Combobox(root, width=12, textvariable=profile_current, values=list_profiles, state='readonly')
  316.     box.grid(column=1, row=0, padx=3, pady=0)  # поле со списком.
  317.     box.bind('<Button-1>', save_keys_and_values)  # при нажатии на выпадающий список.
  318.     box.bind('<<ComboboxSelected>>', update)# при изменения профиля.
  319.     return box
  320. def add1(root,window, new, scrollable_frame):
  321.     value= new_profile.get()
  322.     if value != '':
  323.      list_profiles.append(str(value))
  324.      box = Combobox(root, width=12, textvariable=profile_current, values=list_profiles, state='readonly')
  325.      box.bind('<<ComboboxSelected>>', update)
  326.      box.grid(column=1, row=0, padx=3, pady=0)  # поле со списком
  327.      add_button = Button(text="Добавить профиль", command= lambda:add_new_profile(root, box)).grid(column=2, row=0, padx=10, pady=6)
  328.      box.current(len(list_profiles)-1)
  329.  
  330.      window.destroy()
  331.      new_profile.set('')
  332.      new.remove_all_command(scrollable_frame)
  333.  
  334. def add_new_profile(root,box,new,scrollable_frame):
  335.     window = Toplevel(root)# основа
  336.     window.title("add new profile")  # заголовок
  337.     window.geometry("500x150+750+400")  # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране.
  338.     window.configure(bg='DimGray')  # Цвет фона окна
  339.  
  340.     e=Entry(window, width=30, textvariable=new_profile) #строка ввода профиля.
  341.     e.grid(column=2, row=0, padx=50, pady=5)
  342.     e.focus_set()
  343.     Button(window, text="Добавить профиль", command= lambda:add1(root,window,new,scrollable_frame))\
  344.         .grid(column=2, row=1, padx=50, pady=30) # кнопка добавить профиль, откроется новое окно.
  345. def del_profile_box(root, window, box, profile_for_del):
  346.   profile =profile_for_del.get()
  347.   if profile=="":
  348.    messagebox.showerror("Erorr", "profile not selected")
  349.   if profile=="default":
  350.    messagebox.showerror("Erorr", "this profile cannot be deleted")
  351.   else:
  352.       last_pfofile = list_profiles.index(profile)-1
  353.       list_profiles.remove(profile)
  354.       res= dict_save.return_jnson()['profiles']
  355.       del res[profile]
  356.  
  357.       box = Combobox(root, width=12, textvariable=profile_current, values=list_profiles, state='readonly')
  358.       box.current(last_pfofile)
  359.       box.bind('<<ComboboxSelected>>', update)
  360.       box.grid(column=1, row=0, padx=3, pady=0)  # поле со списком
  361.       add_button = Button(text="Добавить профиль", command=lambda: add_new_profile(root, box)).grid(column=2, row=0, padx=10, pady=6)
  362.  
  363.       new.remove_all_command(scrollable_frame)
  364.       box = create_box()  # Создания выпадающего списка.
  365.       box.current(last_pfofile)
  366.       new.remove_all_command_without_adding()
  367.       filling_fields(dict_save, list_profiles[last_pfofile])  # запол полей
  368.   window.destroy()
  369.  
  370. def del_profile(root,box):
  371.     window = Toplevel(root)# основа
  372.     window.title("Delete profile")  # заголовок
  373.     window.geometry("500x150+750+400")  # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране.
  374.     window.configure(bg='DimGray')  # Цвет фона окна
  375.     profile_for_del = StringVar()
  376.     box1 = Combobox(window, width=30, textvariable=profile_for_del, values=list_profiles, state='readonly') # box с профилями.
  377.     box1.grid(column=2, row=1, padx=50, pady=5)
  378.     Button(window, text="Удалить профиль", command= lambda:del_profile_box(root, window, box, profile_for_del))\
  379.         .grid(column=2, row=2, padx=50, pady=30) # кнопка добавить профиль, откроется новое окно.
  380.  
  381. def start(new, scrollable_frame,box):
  382.   if os.path.exists(data):  # есть ли этот файл.
  383.       with open(data) as json_file:
  384.         res= json.load(json_file)
  385.       dict_save.save_jnson(res)# соранить начальные настройки.
  386.       dict_save.save_old_data(res)
  387.       last_pfofile = res["last_pfofile"] # последний исполь профиль.
  388.       for name in res["profiles"]:
  389.        if not name in list_profiles:
  390.           list_profiles.append(name)
  391.       box =create_box() # Создания выпадающего списка.
  392.       box.current(list_profiles.index(last_pfofile))
  393.       start_startup.set(res["start_startup"])
  394.       filling_fields(dict_save, last_pfofile)# запол полей
  395.  
  396.   else:
  397.      box.current(0)
  398.      new.add_new_command(scrollable_frame)
  399. def delayed_launch(start_startup):
  400.   if start_startup.get():  # Запуск при открытий.
  401.      start_voice()
  402. dict_save=save_dict()
  403. root = Tk()
  404. root.geometry("580x250+650+400")
  405. root.title("voice control in the game")
  406. root.resizable(width=False, height=False)
  407.  
  408. start_startup = BooleanVar()
  409. profile_current, new_profile=StringVar(),StringVar()
  410.  
  411. lb = Label(root, text="Голосовое управления в играх",width=25).grid(column=0, row=0)  # текстовое поле и кнопка для добавления в список
  412.  
  413. arg, values = [], []# списки для слов и значений.
  414.  
  415. container = Frame(root)
  416. canvas = Canvas(container,width=320, height=200)
  417. scrollbar = Scrollbar(container, orient="vertical", command=canvas.yview)
  418. scrollable_frame = Frame(canvas)
  419. scrollable_frame.bind( "<Configure>",
  420.     lambda e: canvas.configure( scrollregion=canvas.bbox("all")
  421.     ))
  422. canvas.create_window((0, 0), window=scrollable_frame, anchor="n")
  423. canvas.configure(yscrollcommand=scrollbar.set)
  424. container.grid()
  425. canvas.grid(sticky=N+S)
  426. scrollbar.grid(column=0, row=0,sticky=N+S+E)# полоса прокрутки.
  427.  
  428. box = create_box() # Создания выпадающего списка.
  429.  
  430. new=iter_counter()# объект класса.
  431. add_button = Button(text="Добавить профиль", command= lambda:add_new_profile(root, box, new,scrollable_frame))\
  432.     .grid(column=2, row=0, padx=10, pady=6,sticky=NE)
  433.  
  434. add_button = Button(text="Удалить профиль", command= lambda:del_profile(root, box))\
  435.     .grid(column=2, row=1, padx=10, pady=16,sticky=N)
  436.  
  437. add_key_button = Button(text="Добавить команду", command= lambda:new.add_new_command(scrollable_frame))\
  438.     .grid(column=1, row=1, padx=1, pady=30,sticky=N)
  439.  
  440. del_key_button_1 = Button(text="Удалить команду", command= lambda:new.del_command())\
  441.     .grid(column=1, row=1,padx=1,pady=90,sticky=N)
  442.  
  443. go_button_2 = Button(text="  Старт  ", command= lambda:start_voice())\
  444.     .grid(column=2, row=1,padx=0,pady=10,sticky=SE)# Запуск управления.
  445. root.protocol("WM_DELETE_WINDOW", on_close)
  446.  
  447. box.grid(column=1, row=0, padx=3, pady=0)  # поле со списком
  448. r1 = Checkbutton(text='Запускать при открытий',
  449.                  variable=start_startup, command=lambda:save_keys_and_values())
  450.  
  451. r1.place(x=323, y=190)
  452.  
  453. start(new, scrollable_frame,box)# запуск всего.
  454.  
  455. t2 = Thread(target=delayed_launch, args=(start_startup,))
  456. t2.start()
  457. root.mainloop()
  458.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement