鱼C论坛

 找回密码
 立即注册
查看: 2300|回复: 5

[已解决]弹窗卡死

[复制链接]
发表于 2021-7-5 12:20:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在一个循环里    条件满足  messagebox.showinfo(‘时间到’) break   
但是它弹窗出现后   总是出现卡死 的情况 同时出现两个弹窗  我点击一个带文本的 ‘确定’这个弹窗关掉了 但是还有一个弹窗 鼠标移动过去就转圈圈 点击就显示无响应  这是什么原因?
最佳答案
2021-7-15 09:55:55
本帖最后由 阿奇_o 于 2021-7-15 10:27 编辑

tkinter 的循环检查,相当于一个线程,而tkinter本身是不能“多线程”的,
所以,解决办法是:要么采用 多线程,要么用 after()和after_cancel() ,如
  1. from tkinter import Tk, messagebox
  2. import datetime as dt
  3. win = Tk()
  4. win.withdraw() # 隐藏主程序窗口
  5. # win.deiconify()  # 显示主窗口
  6. global cid
  7. cid = None
  8. def daka():
  9.     '''循环检查 是否到了指定的打卡时间点'''
  10.     now = dt.datetime.now().strftime('%H:%M:%S')
  11.     print(now)
  12.     if now == '09:52:00':
  13.         messagebox.showinfo(message='上班,打卡了吗?')
  14.     if now == '17:30:00':
  15.         messagebox.showinfo(message='快下班了,记得打卡哦')
  16.    
  17.     global cid
  18.     if cid is not None:
  19.         win.after_cancel(cid)        # 取消前一次的循环;否则会堵塞线程,导致卡顿、崩溃。
  20.         cid = win.after(1000, daka)  # 启动新检查(“后一次”的循环)
  21.         #print(cid)
  22.     else:
  23.         cid = win.after(1000, daka)  # 每秒钟 检查一次(“前一次”循环)
  24.         #print(cid)
  25.    
  26. daka()  # 调用,开始 进入 循环检查
  27. win.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-5 13:13:48 | 显示全部楼层
你打开任务管理器看卡死是不是CPU或内存爆了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-5 15:30:19 | 显示全部楼层
建议你最好 贴上你的代码  要不然就这么说很难分析 问题在哪里
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-15 08:57:36 | 显示全部楼层
本帖最后由 形单影只的鱼 于 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()

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-15 09:34:12 | 显示全部楼层
形单影只的鱼 发表于 2021-7-15 08:57
import datetime,time
import os
from tkinter import messagebox

  1. import datetime, time
  2. import os
  3. from tkinter import messagebox

  4. print('请最小化 这是一个到点提醒打卡的脚本')
  5. b = datetime.time(9, 28, 00)
  6. b = str(b)
  7. d = datetime.time(8, 30, 00)
  8. d = str(d)


  9. def qq():
  10.     while True:
  11.         # print("b =", b ,type(b))
  12.         c = (datetime.datetime.now().strftime('%H:%M:%S'))
  13.         # print (c,type(c))
  14.         if c == b:
  15.             # print ('')
  16.             messagebox.showinfo("温馨弹窗", "店家上班,预定")
  17.             break
  18.         elif c == d:
  19.             print('上班记得打卡')
  20.             messagebox.showinfo("温馨弹窗", "上班记得打卡")
  21.             break
  22.         else:
  23.             time.sleep(0.1)
  24.     return
  25. ---------------看这个位置------------------------
  26. qq()
复制代码


你的在 qq()  这个方法中使用了 while True 这样的死循环,在调用执行这个函数的时候 又是 while True 死循环调用 所以,就出现了你说的这个情况  你在调用这个方法的时候去掉 while True 就行了  两个死循环的地方任意去掉一个都行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-15 09:55:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2021-7-15 10:27 编辑

tkinter 的循环检查,相当于一个线程,而tkinter本身是不能“多线程”的,
所以,解决办法是:要么采用 多线程,要么用 after()和after_cancel() ,如
  1. from tkinter import Tk, messagebox
  2. import datetime as dt
  3. win = Tk()
  4. win.withdraw() # 隐藏主程序窗口
  5. # win.deiconify()  # 显示主窗口
  6. global cid
  7. cid = None
  8. def daka():
  9.     '''循环检查 是否到了指定的打卡时间点'''
  10.     now = dt.datetime.now().strftime('%H:%M:%S')
  11.     print(now)
  12.     if now == '09:52:00':
  13.         messagebox.showinfo(message='上班,打卡了吗?')
  14.     if now == '17:30:00':
  15.         messagebox.showinfo(message='快下班了,记得打卡哦')
  16.    
  17.     global cid
  18.     if cid is not None:
  19.         win.after_cancel(cid)        # 取消前一次的循环;否则会堵塞线程,导致卡顿、崩溃。
  20.         cid = win.after(1000, daka)  # 启动新检查(“后一次”的循环)
  21.         #print(cid)
  22.     else:
  23.         cid = win.after(1000, daka)  # 每秒钟 检查一次(“前一次”循环)
  24.         #print(cid)
  25.    
  26. daka()  # 调用,开始 进入 循环检查
  27. win.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 16:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表