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 减少闪烁。
根据您的情况,您可以有两种解决方案
您可以使用 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.
您可以在 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()
在这两种情况下,您都可以使用较小的值,因为它会在更新小部件后 运行 它不需要时间。
我有以下代码:
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 减少闪烁。
根据您的情况,您可以有两种解决方案
您可以使用
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.
您可以在
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()
在这两种情况下,您都可以使用较小的值,因为它会在更新小部件后 运行 它不需要时间。