Отображение уведомления на рабочем столе после получения нового сообщения python tkinter
Я хотел создать систему уведомлений для Stackru с использованием tkinter, когда элемент не прочитан в моем почтовом ящике, я хочу, чтобы он отображал уведомление (но только один раз), что он и делает. Но это не эффективно. В некотором смысле он показывает уведомление один раз, и когда я нажимаю на него, требуется некоторое время, чтобы уведомление было идентифицировано как прочитанное API, поэтому новые уведомления продолжают появляться, вызывая сбой графического интерфейса (поскольку я запускаю его внутри а
after()
). Поэтому я хотел знать, можно ли каким-то образом сделать часть уведомлений более эффективной.
Код:
import tkinter as tk
import add
from time import ctime
import datetime
from stackapi import StackAPI
from win10toast import ToastNotifier
import threading
import webbrowser
root = tk.Tk()
root.title('Stack Notifier')
def authorise():
print('auth')
global end, acc_key, start, inbox, auth_button
if required:
add.run() #selenium for automation
acc_key = add.acc_key_dum #accesskey passed from another module
start = datetime.datetime.now()
hours_added = datetime.timedelta(hours=24)
end = start + hours_added #time for reaunthentication
site.key = add.key #access key from another module
site.access_token = acc_key #access token from another module
site.max_pages = 1
inbox = site.fetch('users/13382000/inbox')
auth_button['state'] = tk.DISABLED
threading.Thread(target=first).start()
else:
inbox = site.fetch('users/13382000/inbox')
threading.Thread(target=first).start()
def first():
global current, required, inbox, auth_button
def popup():
webbrowser.open(link,new=0)
inbox = site.fetch('users/13382000/inbox')
print('chc')
current = datetime.datetime.now()
if start < current < end:
required = False
else:
required = True
auth_button['state'] = tk.NORMAL
if not required:
print('first')
is_unread = inbox['items'][0]['is_unread']
if is_unread:
title = inbox['items'][0]['title']
item_type = inbox['items'][0]['item_type']
link = inbox['items'][0]['link']
creation_date = ctime(inbox['items'][0]['creation_date'])
noti = ToastNotifier()
noti.show_toast(f'StackOveflow - {item_type}',f'{title} - {creation_date}',duration=5,callback_on_click=popup,threaded=True)
print('yes')
else:
threading.Thread(target=authorise).start()
root.after(1000,threading.Thread(target=first).start)
required = True #a reference to whether authentication is required again, after 24 hrs
label_login = tk.Label(root,text='Click To authorise with Stackru',font=('helvatica',16))
label_login.grid(row=0,columnspan=3)
auth_button = tk.Button(root,text='Authorise',command=authorise)
auth_button.grid(row=1,column=1)
site = StackAPI('stackru')
root.mainloop()
Я знаю, что это не лучший код, но я открыт для идей и предложений.
PS: Я использую селен для автоматизации и запрашиваю учетные данные пользователя. и для этого требуется разрешение каждые 24 часа, поэтому мне также нужно загружать селен каждые 24 часа, что, я думаю, делается отлично.
Заранее спасибо