弹窗卡死
在一个循环里 条件满足messagebox.showinfo(‘时间到’) break但是它弹窗出现后 总是出现卡死 的情况 同时出现两个弹窗我点击一个带文本的 ‘确定’这个弹窗关掉了 但是还有一个弹窗 鼠标移动过去就转圈圈 点击就显示无响应这是什么原因?
{:10_277:}你打开任务管理器看卡死是不是CPU或内存爆了 建议你最好 贴上你的代码要不然就这么说很难分析 问题在哪里 本帖最后由 形单影只的鱼 于 2021-7-15 09:00 编辑
骚年¥学编程 发表于 2021-7-5 15:30
建议你最好 贴上你的代码要不然就这么说很难分析 问题在哪里
import datetime,time
import os
from tkinter import messagebox
print ('请最小化 这是一个到点提醒打卡的脚本')
b = datetime.time(11, 05, 00)
b=str(b)
d = datetime.time(8, 30, 00)
d=str(d)
def qq():
while True:
#print("b =", b ,type(b))
c=(datetime.datetime .now().strftime('%H:%M:%S'))
#print (c,type(c))
if c==b:
#print ('')
messagebox.showinfo("温馨弹窗","店家上班,预定")
break
elif c==d:
print ('上班记得打卡')
messagebox.showinfo("温馨弹窗","上班记得打卡")
break
else:
time.sleep (0.1)
return
while True:
qq()
形单影只的鱼 发表于 2021-7-15 08:57
import datetime,time
import os
from tkinter import messagebox
import datetime, time
import os
from tkinter import messagebox
print('请最小化 这是一个到点提醒打卡的脚本')
b = datetime.time(9, 28, 00)
b = str(b)
d = datetime.time(8, 30, 00)
d = str(d)
def qq():
while True:
# print("b =", b ,type(b))
c = (datetime.datetime.now().strftime('%H:%M:%S'))
# print (c,type(c))
if c == b:
# print ('')
messagebox.showinfo("温馨弹窗", "店家上班,预定")
break
elif c == d:
print('上班记得打卡')
messagebox.showinfo("温馨弹窗", "上班记得打卡")
break
else:
time.sleep(0.1)
return
---------------看这个位置------------------------
qq()
你的在 qq()这个方法中使用了 while True 这样的死循环,在调用执行这个函数的时候 又是 while True 死循环调用 所以,就出现了你说的这个情况你在调用这个方法的时候去掉 while True 就行了两个死循环的地方任意去掉一个都行 本帖最后由 阿奇_o 于 2021-7-15 10:27 编辑
tkinter 的循环检查,相当于一个线程,而tkinter本身是不能“多线程”的,
所以,解决办法是:要么采用 多线程,要么用 after()和after_cancel() ,如
from tkinter import Tk, messagebox
import datetime as dt
win = Tk()
win.withdraw() # 隐藏主程序窗口
# win.deiconify()# 显示主窗口
global cid
cid = None
def daka():
'''循环检查 是否到了指定的打卡时间点'''
now = dt.datetime.now().strftime('%H:%M:%S')
print(now)
if now == '09:52:00':
messagebox.showinfo(message='上班,打卡了吗?')
if now == '17:30:00':
messagebox.showinfo(message='快下班了,记得打卡哦')
global cid
if cid is not None:
win.after_cancel(cid) # 取消前一次的循环;否则会堵塞线程,导致卡顿、崩溃。
cid = win.after(1000, daka)# 启动新检查(“后一次”的循环)
#print(cid)
else:
cid = win.after(1000, daka)# 每秒钟 检查一次(“前一次”循环)
#print(cid)
daka()# 调用,开始 进入 循环检查
win.mainloop()
页:
[1]