我正在使用tkinter编写GUI和sqlite3数据库的python警报程序。我想更新“ display_frame”功能,以便每当我在数据库中添加或删除警报时,程序都会自动更新以反映数据库中的更改,而无需重新运行主窗口。我已经尝试了几种互联网上的方法,但是没有一种方法适合我。应该清除“ tframe-topframe”的代码在“刷新功能”中。我将不胜感激,在此先感谢
class parent:
def __init__(self, master):
self.master = master
self.master.title("Alarm")
self.width = 500
self.height = 600
self.master.geometry('%sx%s' % (self.width, self.height))
self.master.configure(background='grey11')
self.master.resizable(0, 0) # prevents user from resizing the window
self.master.focus_set()
self.scroll = Scrollbar(self.master)
self.scroll.pack(side=RIGHT, fill=Y)
# frame1
self.frame1 = Frame(self.master, bg='grey15', height=50, width=500, cursor='dot', highlightcolor='black')
self.frame1.pack(fill='both')
#self.frame1.pack_propagate(True)
self.add = Button(self.frame1, text='+',bg='grey15',fg='gold',borderwidth=0,highlightthickness=0,activeforeground='gold',activebackground='grey15',width=2, bd=0,command=self.create_alarm)
self.add.config(font=('new roman', 16, 'normal'))
self.rm = Button(self.frame1,text='Edit',bg='grey15',fg='gold',borderwidth=0,width=3,bd=0,highlightthickness=0,activeforeground='gold',activebackground='grey15',command=self.delete_window)
self.rm.config(font=('new roman', 12, 'normal'))
self.add.pack(side=RIGHT)
self.rm.pack(side=LEFT)
# frame2
self.frame2 = Frame(self.master, bg='grey15', height=50, width=500, cursor='dot', highlightcolor='black')
self.frame2.pack(fill='both', side=BOTTOM)
self.del_all = Button(self.frame2, text='Delete all',width=6,bg='grey15',fg='gold',borderwidth=0,highlightthickness=0,activeforeground='gold',activebackground='grey15',bd=0,command=self.delete_all)
self.del_all.config(font=('new roman', 12, 'normal'))
self.Exit = Button(self.frame2, text='Exit',width=6,bg='grey15',fg='gold',borderwidth=0,highlightthickness=0,activeforeground='gold',activebackground='grey15',bd=0,command=self.Exit)
self.Exit.config(font=('new roman', 12, 'normal'))
self.del_all.pack(side=LEFT)
self.Exit.pack(side=RIGHT)
def tframe(self):
self.topframe = Frame(self.master, bg='grey11', height=550, width=500, bd=2,highlightbackground="grey", highlightthickness=1)
self.topframe.pack_propagate(True)
self.topframe.pack(fill='both')
return self.topframe
def delete_all(self):
try:
MsgBox = messagebox.askquestion ('Delete Alarms','Are you sure you want to delete all alarms',icon = 'warning')
if MsgBox == 'yes':
cursor.execute("DELETE FROM Alarm")
self.display_alarms()
else:
return
#messagebox.showinfo('Return','You will now return to the application screen')
except Exception as error:
messagebox.showinfo('Error ',str(error))
def Exit(self):
MsgBox = messagebox.askquestion ('Exit Application','Are you sure you want to exit the application',icon = 'warning')
if MsgBox == 'yes':
self.master.destroy()
else:
return
#messagebox.showinfo('Return','You will now return to the application screen')
def display_frame(self, time, lbl):
try:
topframe = self.tframe()
frame = Frame(topframe, bg='black', height=100, width=400, bd=0,highlightbackground="grey11", highlightthickness=1)
frame.pack(fill='both')
label = Label(frame, text=time, bg='black', fg='azure3')
label.config(font=('new roman', 14, 'normal'))
label2 = Label(frame, text=lbl, bg='black', fg='azure3')
label2.config(font=('helvetica', 14, 'normal'))
label.pack(side=LEFT)
label2.pack(side=RIGHT, padx=20)
except Exception as error:
messagebox.showinfo('Error in frame',str(error))
# list all the alarms inside the Alarms database
def display_alarms(self):
with connection:
try:
cursor.execute("""SELECT AlarmTime, Label FROM Alarm ORDER BY AlarmTime""")
alarms = []
for alarm in cursor.fetchall():
time = alarm[0][10:16]
label = alarm[1]
self.display_frame(time, label)
except Exception as error:
messagebox.showinfo('Error ',str(error))
#calls the delete alarm class
def delete_window(self):
try:
self.delete = Toplevel(self.master)
self.remove = child1(self.delete)
except Exception as error:
messagebox.showinfo('Error ',str(error))
#calls the create alarm class
def create_alarm(self):
try:
self.create = Toplevel(self.master)
self.add = child2(self.create)
except Exception as error:
messagebox.showinfo('Error ',str(error))
def refresh(self):
frame = self.tframe()
frame.pack_forget() # delete currrent frame
return
# configure the user interface for delete method
class child1:
def __init__(self, master):
self.master = master
self.master.title("Remove Alarm")
self.width = 350
self.height = 150
self.master.geometry('%sx%s' % (self.width, self.height))
self.master.configure(background='grey18')
self.master.resizable(0, 0) # prevents user from resizing the window
self.entry_val = StringVar()
self.label = Label(self.master, text='Enter alarm label to delete', fg='gold', bg='grey18', width=200)
self.label.config(font=('new roman', 12, 'normal'))
self.reply = Entry(self.master, fg='black', width=30, textvariable=self.entry_val)
self.enter = Button(self.master, text='Enter', fg='white', bg='grey18',activebackground='grey15',activeforeground='white', width=4, relief='sunken',command=self.delete_alarm)
self.enter.config(font=('heveltica', 13, 'normal'))
self.cancel = Button(self.master, text='Cancel', fg='white', bg='grey18',activebackground='grey15',activeforeground='white', width=4, relief='sunken', command=self.master.withdraw)
self.cancel.config(font=('heveltica', 13, 'normal'))
self.label.pack()
self.reply.pack(pady=10)
self.enter.pack(side=LEFT, padx=20)
self.cancel.pack(side=RIGHT, padx=30)
self.reply.focus_set()
# delete a specific alarm from the database
def delete_alarm(self):
try:
#self.reply.delete(0, END)
label = self.entry_val.get()
cursor.execute("DELETE FROM Alarm WHERE Label = :Label", {'Label': label})
connection.commit()
messagebox.showinfo('Success ', " Alarm successfully deleted")
self.master.withdraw()
except Exception as error:
messagebox.showinfo('Error ',str(error))
finally: return