我正在尝试创建一个程序,该程序会抓取一个网站来查询伊斯兰祈祷时间,然后在其中一个到期时发出警报。到目前为止,我在编码方面已经取得了成功,但是当涉及到Tkinter的GUI时,这是一项繁琐的任务。我的问题是,当我试图在一个简单的窗口中显示报废的时间时。它首先滞后,有时甚至从不显示,并且在执行时从不显示文本,并一直显示加载圆圈。这是什么问题?
#import libraries
from bs4 import BeautifulSoup
from urllib.request import urlopen
from datetime import datetime , timedelta
from os import popen
from time import sleep
from win10toast import ToastNotifier
from tkinter import *
#html parsing
manar = "http://almanar.com.lb/legacy/salat.php" #webpage
page = urlopen(manar)
soup = BeautifulSoup(page,"html.parser")
date_box = soup.find("h2")#("div" ,attrs = {"class":"time full-date"})#attribute needed
#getting times(part1)
today = date_box.text.strip()
#today = today.split(" ")
today = " ".join(today.split())
print(today)
#current time
now = datetime.now()
print("at: " + str(now))
#notifications
toaster = ToastNotifier()
#getting times(part2)
day_parts = ["prayer-time emsak","prayer-time fajer","prayer-time shorook","prayer-time dohor","prayer-time aser","prayer-time moghreb","prayer-time ishaa","prayer-time midnight", ]
prayer = []
for part in day_parts :
day_part = soup.find("div",attrs = {"class":part})
day_part = day_part.text.strip()
day_part = " ".join(day_part.split())
prayer.append(day_part)
prayer_times = []
for pray_time in prayer:
if prayer.index(pray_time) == 1:
pray_time = pray_time.split()[1:3]
prayer_time = ": ".join(pray_time)
elif prayer.index(pray_time) == len(prayer) - 1:
pray_time = pray_time.split()
word = " ".join(pray_time[:2])
prayer_time = word + ": " + pray_time[2]
else:
prayer_time = ": ".join(pray_time.split())
print(prayer_time)
prayer_times.append(prayer_time)
toaster.show_toast("Prayer Time:", prayer_time)
text_prayers = "{}\n{}\n{}\n{}\n{}".format(prayer_times[0],prayer_times[1],prayer_times[2],prayer_times[3],prayer_times[4])
#Sounding Adhan
seconds_hms = [3600, 60, 1]
now_seconds = sum([a*b for a,b in zip(seconds_hms, [now.hour, now.minute, now.second])])
times = []
for pnt in prayer_times:
lpnt = pnt.split()
if len(lpnt) == 3: #because midnight is 2 words
time = lpnt[2]
else:
time = lpnt[1]
times.append(time)
times_in_sec = []
for dpt in times: #dayparttime
adhan_time = [int(n) for n in dpt.split(":")]
dpts = sum([a*b for a,b in zip(seconds_hms,adhan_time)])
times_in_sec.append(dpts)
#msg box
root = Tk()
root.title("prayer times")
frm = Frame(root,bg="yellow")#,height= 20, width=30,)
txt = Text(frm,height= 10, width=20)
txt.insert(INSERT,text_prayers)
txt.pack()
ok = Button(root,text="ok", fg="green",command= root.destroy)
ok.pack(side="bottom")
frm.pack()
root.mainloop()
#main process
if __name__ == "__main__":
while True :
for tis in times_in_sec :
time_diff_seconds = tis - now_seconds
if time_diff_seconds < 0:
continue
elif time_diff_seconds == 0 :
print("praying time!")
popen("c://users//Dell//downloads//adhan.mp3")
toaster.show_toast("next adhan starts in : ","%s" %timedelta(seconds=time_diff_seconds))
elif time_diff_seconds > 0 :
print("next adhan starts in : %s" %timedelta(seconds=time_diff_seconds))
toaster.show_toast("next adhan starts in : ","%s" %timedelta(seconds=time_diff_seconds))
sleep(time_diff_seconds)
popen("c://users//Dell//downloads//adhan.mp3")
else:
print("this is a module")
答案 0 :(得分:0)
在代码中放入npm install pm2 -g
时,它将控制该窗口,直到您将其关闭。然后它将继续下一行。因此,打开窗口后,您插入的任何内容都不会运行。
您可以使用这3条等效线来更改pm2 update
。您可以将它们包含在root.mainloop()
中,也可以不止一次放置它们(如果您觉得它仍然很笨):
root.mainloop()
您应该更改的另一件事是while True
的用法。在此功能期间,窗口将滞后,因为不会使用上面的行进行更新。您可以尝试使用while True:
root.update()
root.update_idletasks()
:
tkinter.after(delay_ms,callback = None,* args) 请求Tkinter在至少delay_ms毫秒的延迟后使用参数args调用函数回调。实际花费多长时间没有上限,但是您的回调不会比您的请求更早被调用,并且只会被调用一次。 [archive.org]
因此,总而言之,tkinter中的重要事情是始终运行time.sleep()
或等效命令。这样,您的窗口将永远不会滞后。