首页 > 解决方案 > 关闭屏幕会杀死 tkinter,从而杀死我的 Python 闹钟。怎么修?

问题描述

这是完整的代码。我是一个初学者,很多代码来自网上。任何事情都会有很大的帮助。

关闭屏幕会杀死 tkinter,从而杀死我的 Python 闹钟。怎么修?

下面的大部分文字都是垃圾我想出来的,所以你不必阅读它:它由 3 个部分组成:时钟 GUI 显示、按钮和闹钟设置,以及关闭/打开监视器功能。设计目标是学习 python 并制作一个唤醒日出的东西,用你的显示器或投影仪模拟日出。因此,当闹钟响起时,投影仪会打开,并显示一个全屏时钟,背景颜色越来越亮。希望让那些需要在黑暗中醒来的人更容易醒来。我相信有更好的实现方式(我用 Chromebook 和 Arduino 控制 IR 来打开投影仪,过去有一个独立的 Arduino 继电器),但它仍然是为了学习。

from tkinter import font as tkfont
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import time
import datetime
import os

import ctypes
def ScreenOff():
    return ctypes.windll.user32.SendMessageW(65535, 274, 61808, 2)
def ScreenOn():
    return ctypes.windll.user32.SendMessageW(65535, 274, 61808, -1)

root = Tk()
root.geometry("640x480")
root.frame = Frame(root)
root.frame.pack(fill = "both")
label = Label(root, text= "Welcome", bg = "black", fg = "white", font=("Times", 50))
label.pack(side= "top", fill = "both", expand = 1)
root.title_font = tkfont.Font(family = "Times", size = 100, weight = "bold", slant = "italic")
root.title("Clock")

def tick():
    global wake
    current_time = time.strftime("%I:%M:%S")
    label.config(text=current_time)
    label.after(200, tick)


    # alarm start

def SubmitButton():
  AlarmTime= entry1.get()
  Message1()
  #label2.config(text ="The Alarm will Ring at {} ".format(AlarmTime))  #delayed in execution
  CurrentTime = time.strftime("%H:%M")
  print("the alarm time is: {}".format(AlarmTime))
  #label2.config(text="")
  while AlarmTime != CurrentTime:
    #label2.config(text ="The Alarm will Ring at {} ".format(AlarmTime))
    CurrentTime = time.strftime("%H:%M")
    time.sleep(1)
    ScreenOff()
  if AlarmTime == CurrentTime:
     ScreenOn()
     print("now Alarm Musing Playing")
     os.system("start alarm-music.mp3")
     label2.config(text = "Alarm music playing.....")
     messagebox.showinfo(title= 'Alarm Message', message= "{}".format(entry2.get()))
def Message1():
    AlarmTimeLable= entry1.get()
    label2.config(text="the Alarm time is Counting...")
    #label2.config(text= "the Alarm will ring at {}".format(AlarmTimeLable))
    messagebox.showinfo(title = 'Alarm clock', message = 'Alarm will Ring at {}'.format(AlarmTimeLable))     
frame1 = ttk.Frame(root)
frame1.pack()
frame1.config(height = 100, width = 100)

label1= ttk.Label(frame1,text = "Enter the Alarm time :")
label1.pack()


entry1 = ttk.Entry(frame1, width = 30)
entry1.pack()
entry1.insert(3,"example - 13:15")

labelAlarmMessage= ttk.Label(frame1, text="Alarm Message:")
labelAlarmMessage.pack()

entry2= ttk.Entry(frame1, width=30)
entry2.pack()

button1= ttk.Button(frame1, text= "submit", command=SubmitButton)
button1.pack()
#this Label2 will show the Last Alarm Time
label2= ttk.Label(frame1)
label2.pack()

    
#label2.config(text="hello")



tick()
root.mainloop()

例如,我可以重新启动 Tkinter 吗?还是让它不崩溃?还是让它崩溃但我的闹钟仍在后台工作?

非常感谢!

标签: pythonuser-interfacetkinterhelper

解决方案


您可以简单地在 Windows 的终端中编写此命令以将程序作为后台进程运行

pythonw ./name.py

您还可以使用 Windows 任务调度程序在后台运行您的程序


推荐阅读