Python 调用另一个函数时的计时问题

Python timing problem when call a function in another

我有以下代码:

def update_contact_from_crm_to_import_in_365():

sql = "SELECT * FROM CRM_PRIMARY WHERE copy_to_365 = 'To update' ORDER BY CRM_PRIMARY.id DESC"
search_result = my_cursor.execute(sql)
search_result = my_cursor.fetchall()
sql_result.clear()
sql_result.append(search_result)

Filter(sql_result[0])

# Get id of sql result to pass them
list_get_selected_id.clear()
for res in (sql_result):
    for id in (res):
        list_get_selected_id.append(id[0])


time.sleep(5)

validate1 = messagebox.askquestion("Update ?", "Launch update ?")
if validate1 == 'yes':
    open_dynamics_365_full_contact_list()

我的问题是 Filter(sql_result[0]) 似乎是从 update_contact_from_crm_to_import_in_365 函数的末尾开始的(在 messagebox 之后)

到目前为止,当我调用 update_contact_from_crm_to_import_in_365() 时它会显示消息框,一旦有人回答它就会调用 Filter()

但我想调用 Filter,等待 5 秒让 Filter 继续并结束,然后显示消息框。

请问我该怎么做?

我读过有关线程的内容,但我只是 Python 的初学者,所以对我来说还是有点复杂。

提前致谢

我不能 运行 但问题可能是 mainloop 第一个 运行 函数 update_contact_from_crm_to_import_in_365 它等待它结束,然后它更新小部件寡妇。这样它可以在一瞬间更新所有小部件,因此 window 减少闪烁。

根据您的情况,您可以有两种解决方案

  1. 您可以使用 root.after(5000, function_with_message) 而不是 sleep(),然后 update_contact_from_crm_to_import_in_365 将完成工作并返回到 mainloop,这将更新小部件- 5000 毫秒后它将 运行 function_with_message.

    def show_message():
        validate1 = messagebox.askquestion("Update ?", "Launch update ?")
        if validate1 == 'yes':
            open_dynamics_365_full_contact_list()
    
    def update_contact_from_crm_to_import_in_365():
    
        sql = "SELECT * FROM CRM_PRIMARY WHERE copy_to_365 = 'To update' ORDER BY CRM_PRIMARY.id DESC"
        search_result = my_cursor.execute(sql)
        search_result = my_cursor.fetchall()
        sql_result.clear()
        sql_result.append(search_result)
    
        Filter(sql_result[0])
    
        # Get id of sql result to pass them
        list_get_selected_id.clear()
        for res in (sql_result):
            for id in (res):
                list_get_selected_id.append(id[0])
    
        root.after(5000, show_message)
        #root.after(1, show_message) # it will no need to wait so long.
    
  2. 您可以在 Filter() 之后使用 root.update() 强制 mainloop 在函数结束前更新小部件。

    def update_contact_from_crm_to_import_in_365():
    
        sql = "SELECT * FROM CRM_PRIMARY WHERE copy_to_365 = 'To update' ORDER BY CRM_PRIMARY.id DESC"
        search_result = my_cursor.execute(sql)
        search_result = my_cursor.fetchall()
        sql_result.clear()
        sql_result.append(search_result)
    
        Filter(sql_result[0])
    
        # Get id of sql result to pass them
        list_get_selected_id.clear()
        for res in (sql_result):
            for id in (res):
                list_get_selected_id.append(id[0])
    
        root.update()  # force tkinter to update widgets in window
        #time.sleep(5)
    
        validate1 = messagebox.askquestion("Update ?", "Launch update ?")
        if validate1 == 'yes':
            open_dynamics_365_full_contact_list()
    

在这两种情况下,您都可以使用较小的值,因为它会在更新小部件后 运行 它不需要时间。