形单影只的鱼 发表于 2021-7-5 12:20:41

弹窗卡死

在一个循环里    条件满足messagebox.showinfo(‘时间到’) break   
但是它弹窗出现后   总是出现卡死 的情况 同时出现两个弹窗我点击一个带文本的 ‘确定’这个弹窗关掉了 但是还有一个弹窗 鼠标移动过去就转圈圈 点击就显示无响应这是什么原因?

fish_nian 发表于 2021-7-5 13:13:48

{:10_277:}你打开任务管理器看卡死是不是CPU或内存爆了

骚年¥学编程 发表于 2021-7-5 15:30:19

建议你最好 贴上你的代码要不然就这么说很难分析 问题在哪里

形单影只的鱼 发表于 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()

骚年¥学编程 发表于 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 就行了两个死循环的地方任意去掉一个都行

阿奇_o 发表于 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()
页: [1]
查看完整版本: 弹窗卡死