每当程序进行更改(添加或删除)时,我都无法更新tkinter框架。这是代码和描述

时间:2019-11-29 10:50:34

标签: python tkinter

我正在使用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

0 个答案:

没有答案