代码之家  ›  专栏  ›  技术社区  ›  Shawn

为什么过一段时间我的tkinter顶层会冻结?

  •  -3
  • Shawn  · 技术社区  · 6 年前

    我的主窗口和顶层都有秒表。一旦程序启动,手表就会启动,并通过关闭程序停止。使用按钮启动顶层。顶层应该显示秒表的副本。但是,当我打开顶层超过一个小时,它就会冻结。主窗口运行正常。当我手动关闭并重新打开它时,顶层可以再工作一个小时左右。有人知道可能是什么问题吗?我在Windows操作系统上运行代码。

    相关代码如下:

    import datetime
    import time
    import tkinter as tk
    
    time_elapse_flag = False
    start_time = datetime.datetime.now()
    diff = 0
    
    def time_elapse():
        global time_elapse_flag
        global diff
    
        if(not time_elapse_flag):      
                time_elapse_flag = True
                time_elapse_count = tk.Label(window, text='', relief='sunken', bg='white', font='Helvetica 16 bold')
                time_elapse_count.place(x=10, y=150, width=200, height=50)
                start_time = datetime.datetime.now().replace(microsecond=0)
    
                time_elapse_label = tk.Label(window, text='Recording data since:', font='Helvetica 12 bold')
                time_elapse_label.place(x=10, y=120, width=200, height=30)
    
                def update_time():
                    global start_time
                    global diff
                    current_time = datetime.datetime.now().replace(microsecond=0)
                    diff = current_time - start_time
                    time_elapse_count.config(text=diff)
                    time_elapse_label.after(1000,update_time)
    
                update_time()
    
        else:
            time_elapse_flag = False
            time_elapse_count = tk.Label(window, text='')
            time_elapse_count.place(x=10, y=150, width=200, height=50)
    
            time_elapse_label = tk.Label(window, text='')
            time_elapse_label.place(x=10, y=120, width=200, height=30)
    
    def Param_Window():   
        global time_elapse_flag
        global diff
    
        pw = tk.Toplevel()
        pw.geometry('1200x550') 
    
        def update_values():
            global diff
    
            if(time_elapse_flag):
                    time_elapse_label = tk.Label(pw, text='Recording data since:', font='Helvetica 20 bold')
                    time_elapse_count = tk.Label(pw, text=diff, relief='sunken', bg='white', font='Helvetica 16 bold')
                    time_elapse_label.place(x=640, y=350, width=300, height=50)
                    time_elapse_count.place(x=640, y=400, width=200, height=50)
            else:
                    time_elapse_label = tk.Label(pw, text='')
                    time_elapse_count = tk.Label(pw, text='')
                    time_elapse_label.place(x=640, y=350, width=300, height=50)
                    time_elapse_count.place(x=640, y=400, width=200, height=50)
    
            pw.after(800,update_values)
    
        update_values()
    
    if __name__ == "__main__":
        window = tk.Tk()
        window.geometry('550x250')
    
        disp_param_button = tk.Button(window, text='Display Parameters', command=Param_Window, bg='sky blue', font='Helvetica 12 bold', width=20, state='normal', relief='raised')
        disp_param_button.place(x=300, y=150)
        print('Automatically starting in')
    
        for cd in range(5):
            print(5-cd)
            time.sleep(1)
    
        time_elapse()
    
        window.mainloop( )
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Bryan Oakley    6 年前

    Param_Window

        2
  •  0
  •   Mike - SMT    6 年前

    1. Param_Window

    import tkinter as tk
    import datetime
    import time
    
    time_elapse_flag = False
    start_time = datetime.datetime.now().replace(microsecond=0)
    
    def time_elapse():
        global time_elapse_flag
        global diff
    
        if(not time_elapse_flag):      
            time_elapse_flag = True
            time_elapse_count = tk.Label(window, text='', relief='sunken', bg='white', font='Helvetica 16 bold')
            time_elapse_count.place(x=10, y=150, width=200, height=50)
            start_time = datetime.datetime.now().replace(microsecond=0)
    
            time_elapse_label = tk.Label(window, text='Recording data since:', font='Helvetica 12 bold')
            time_elapse_label.place(x=10, y=120, width=200, height=30)
    
            def update_time():
                global start_time
                global diff
                current_time = datetime.datetime.now().replace(microsecond=0)
                diff = current_time - start_time
                time_elapse_count.config(text=diff)
                time_elapse_label.after(1000, update_time)
    
            update_time()
    
        else:
            time_elapse_flag = False
            time_elapse_count = tk.Label(window, text='')
            time_elapse_count.place(x=10, y=150, width=200, height=50)
    
            time_elapse_label = tk.Label(window, text='')
            time_elapse_label.place(x=10, y=120, width=200, height=30)
    
    
    def Param_Window():   
        global time_elapse_flag
        global diff
    
        pw = tk.Toplevel()
        pw.geometry('1200x550') 
        time_elapse_label = tk.Label(pw, text='Recording data since:', font='Helvetica 20 bold')
        time_elapse_count = tk.Label(pw, text=diff, relief='sunken', bg='white', font='Helvetica 16 bold')
        time_elapse_label.place(x=640, y=350, width=300, height=50)
        time_elapse_count.place(x=640, y=400, width=200, height=50)
    
        def update_values():
            global diff
    
            if(time_elapse_flag):
                time_elapse_label.config(text='Recording data since:')
                time_elapse_count.config(text=diff)
    
            else:
                time_elapse_label.config(text='')
                time_elapse_count.config(text='')
    
            pw.after(800, update_values)
    
            update_values()
    
    if __name__ == "__main__":
    
        print('Automatically starting in')
    
        for cd in range(5):
            print(5-cd)
            time.sleep(1)
    
        window = tk.Tk()
        window.geometry('550x250')
    
        disp_param_button = tk.Button(window, text='Display Parameters', command=Param_Window, bg='sky blue', font='Helvetica 12 bold', width=20, state='normal', relief='raised')
        disp_param_button.place(x=300, y=150)
    
        time_elapse()
        window.mainloop()