我试图用tkinter创建一个报警gui。我无法为列表中的多个类对象更新主窗口。我面临的问题是,设置报警并单击保存后,应在主窗口[mw()]中看到报警对象。此更新仅在第一个报警对象停止工作后才可见。只有在单击“保存”按钮后才会出现错误。但我可以确保报警通知[gialarm()]在特定时间有效。这只是我的第一个gui项目
from tkinter import *
import tkinter.font as tkfont
from datetime import datetime
import winsound
pw=[]
al=[]
i=0
alarml=[]
class alarm:
onof=1
def __init__(self,ahour,amin,addon,label):
self.ahour=ahour
self.amin=amin
self.addon=addon
self.label=label
def gialarm(i,alarml):
def notification(i,alarml):
if alarml[i].addon==1:
ampm='PM'
elif alarml[i].addon==0:
ampm='AM'
notify=Tk()
notify.geometry('400x250')
time=IntVar()
ftime=tkfont.Font(size=40)
nl1=Label(notify,textvariable=time,width=100,font=ftime).pack()
lab=IntVar()
flab=tkfont.Font(size=30)
nl2=Label(notify,textvariable=lab,width=100,font=flab).pack()
time.set(f'{alarml[i].ahour}:{alarml[i].amin} {ampm}')
lab.set(alarml[i].label)
notify.mainloop()
while alarml:
if alarml[i].addon==1:
h=alarml[i].ahour+12
elif alarml[i].addon==0:
h=alarml[i].ahour
if datetime.now().hour==h and datetime.now().minute==alarml[i].amin:
winsound.Beep(1000,1000)
notification(i,alarml)
break
def mw():
然后我尝试使用tkinter的'after'函数创建更新函数。但它只对第一个对象有效。然后,它不适用于下一个保存的对象
def update_mw():
global i
if alarml:
if alarml[i].addon==1:
ampm='PM'
elif alarml[i].addon==0:
ampm='AM'
pw.append(PanedWindow(orient=VERTICAL,borderwidth=10,bd=10,bg='green'))
onof=IntVar()
al.append(Checkbutton(alarmgui,text=f'{alarml[i].ahour}:{alarml[i].amin} {ampm}{alarml[i].label}',variable=onof,onvalue=1,offvalue=0))
pw[i].pack(fill=X)
pw[i].add(al[i])
alarmgui.mainloop()
if onof.get()==1:
alarml[i].onof=1
elif onof.get()==0:
alarml[i].onof=0
i+=1
else:
alarmgui.after(100,update_mw)
return None
def save_alarm(add,ahour,amin,addon,label,alarmgui):
global alarml
r=alarm(ahour.get(),amin.get(),addon.get(),label.get())
alarml.append(r)
add.destroy()
ahour.set(None)
amin.set(None)
addon.set(None)
label.set(None)
def set_alarm(alarmgui):
add=Toplevel()
add.geometry('300x400')
lf1=LabelFrame(add,text='Add your alarm').pack(fill='both',expand='yes')
l1=Label(add,text='Time:').place(x=10,y=30)
ahour=IntVar()
sb1=Spinbox(add,from_=1,to=12,textvariable=ahour,width=5).place(x=140,y=30)
l2=Label(add,text=':').place(x=190,y=30)
amin=IntVar()
sb1=Spinbox(add,from_=0,to=59,textvariable=amin,width=5).place(x=200,y=30)
addon=IntVar()
r1=Radiobutton(add,text='AM',variable=addon,value=0).place(x=140,y=60)
r2=Radiobutton(add,text='PM',variable=addon,value=1).place(x=190,y=60)
label=StringVar()
e1=Entry(add,textvariable=label).place(x=130,y=100,width=150)
l3=Label(add,text='Alarm label:').place(x=10,y=100)
b2=Button(add,text='Save Alarm',width=30,height=2,command=lambda: save_alarm(add,ahour,amin,addon,label,alarmgui)).pack(side='bottom')
add.mainloop()
alarmgui=Tk()
alarmgui.geometry('500x500')
b1=Button(alarmgui,text='ADD ALARM',width=30,height=2,command=lambda: set_alarm(alarmgui)).place(x=150,y=450)
alarmgui.after(1,update_mw)
alarmgui.mainloop()
mw()
for i in range(len(alarml)):
if alarml[i].onof:
gialarm(i,alarml)
目前没有回答
相关问题 更多 >
编程相关推荐