Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.34 KB | None | 0 0
  1. from tkinter import *
  2. from tkinter import messagebox
  3. import asyncio
  4. import threading
  5. import requests
  6. import logging
  7.  
  8.  
  9. # логирование
  10. FORMAT = '[%(levelname)s] %(message)s'
  11. file_handler = logging.FileHandler('ip.log', 'w', encoding='utf-8')
  12. file_handler.setFormatter(logging.Formatter(FORMAT))
  13.  
  14. # уровень логинга INFO
  15. logging.basicConfig(level=logging.INFO, format=FORMAT)
  16. logging.getLogger().addHandler(file_handler)
  17. logging.getLogger("asyncio").setLevel(logging.INFO)
  18.  
  19. # флаг остановки
  20. stop_flag = False
  21.  
  22. # глобальные переменные для ip-адреса
  23. ip = None
  24. new_ip = None
  25.  
  26. # добавление заданий в event loop
  27. def _asyncio_thread(async_loop):
  28.     async_loop.run_until_complete(task_loop())
  29.  
  30. # функция, которая стартует асинхронные потоки по нажатию кнопки
  31. def do_tasks(async_loop):
  32.     threading.Thread(target=_asyncio_thread, args=(async_loop,)).start()
  33.  
  34. # получение ip в бесконечном цикле асинхронно
  35. async def get_ip():
  36.     global stop_flag
  37.     global ip
  38.     global new_ip
  39.     logging.info('Получаем IP-адрес')
  40.     while True:
  41.         response = requests.get('https://ramziv.com/ip')
  42.         ip = new_ip
  43.         new_ip = response.text
  44.         # если ip = None - ничего не пишем
  45.         if ip is not None:
  46.             logging.info(ip)
  47.         # при изменение ip пишем в консоль (и в файл ip.log) сообщение
  48.         if ip is not None and ip != new_ip:
  49.             logging.info('IP-адрес был изменен')
  50.         # остановка цикла (нужно только последнюю итерацию подождать)
  51.         if stop_flag:
  52.             break
  53.  
  54.         # проверка ip каждые 10 секунд
  55.         await asyncio.sleep(10)
  56.  
  57. # задания (функции, которые будут выполняться)
  58. async def task_loop():
  59.     task1 = get_ip()
  60.     # при добавлении check2() в список заданий
  61.     # при изменении IP-адреса будет выводится messagebox с ошибкой
  62.     # если не добавлять, то только текст в консоль (ip изменился)
  63.     task2 = check2()
  64.     tasks = [task1, task2]
  65.     completed, pending = await asyncio.wait(tasks)
  66.  
  67.  
  68. # проверка на изменение ip по кнопке
  69. def check():
  70.     global ip
  71.     global new_ip
  72.  
  73.     # messagebox
  74.     if ip is not None and ip != new_ip:
  75.         messagebox.showinfo(message='IP был изменен')
  76.     else:
  77.         messagebox.showinfo(message='IP не изменился')
  78.  
  79. # проверка на изменение автоматически
  80. async def check2():
  81.     global ip
  82.     global new_ip
  83.     global stop_flag
  84.     while True:
  85.         # messagebox
  86.         if ip is not None and ip != new_ip:
  87.             messagebox.showerror(message='IP был изменен, ошибка')
  88.  
  89.         # остановка цикла (нужно только последнюю итерацию подождать)    
  90.         if stop_flag:
  91.             break
  92.  
  93.         # проверка ip каждые 10 секунд
  94.         await asyncio.sleep(10)
  95.  
  96.  
  97. # остановка получения ip в цикле
  98. # перед выходом из программы лучше нажать на нее
  99. # после чего потоки сделают еще 1 итерацию и завершатся
  100. def stop():
  101.     global stop_flag
  102.     print('stop')
  103.     stop_flag = True
  104.  
  105. # основной поток программы
  106. def main(async_loop):
  107.     root = Tk()
  108.     # привязка старта асинхронных потоков к кнопке
  109.     Button(master=root, text='IP в цикле', command= lambda:do_tasks(async_loop)).pack()
  110.     # кнопки с синхронными функциями
  111.     buttonX = Button(master=root, text='Проверить IP', command=check).pack()
  112.     buttonY = Button(master=root, text='Stop', command=stop).pack()
  113.     root.mainloop()
  114.  
  115. if __name__ == '__main__':
  116.     # создание event loop
  117.     async_loop = asyncio.get_event_loop()
  118.     # добавление в него основного потока
  119.     main(async_loop)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement