微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么tkinter窗口滞后并且不显示告诉

如何解决为什么tkinter窗口滞后并且不显示告诉

我正在尝试创建一个程序,该程序会抓取一个网站来查询伊斯兰祈祷时间,然后在其中一个到期时发出警报。到目前为止,我在编码方面已经取得了成功,但是当涉及到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,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")
    
    

    

解决方法

在代码中放入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()或等效命令。这样,您的窗口将永远不会滞后。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。