鱼C论坛

 找回密码
 立即注册
查看: 1885|回复: 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() ,如
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-5 13:13:48 | 显示全部楼层
你打开任务管理器看卡死是不是CPU或内存爆了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-5 15:30:19 | 显示全部楼层
建议你最好 贴上你的代码  要不然就这么说很难分析 问题在哪里
想知道小甲鱼最近在做啥?请访问 -> 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()

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-15 09:34:12 | 显示全部楼层
形单影只的鱼 发表于 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 就行了  两个死循环的地方任意去掉一个都行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-15 09:55:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 06:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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