【问题标题】:Python timing problem when call a function in another在另一个中调用函数时的Python计时问题
【发布时间】:2021-06-10 12:12:10
【问题描述】:

我有以下代码:

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 秒过滤器继续并结束,然后显示消息框。

请问我该怎么做?

我读过关于 Threading 的文章,但我只是 Python 的初学者,所以对我来说有点复杂。

提前致谢

【问题讨论】:

  • 过滤器是做什么的?你能把它的代码贴在 OP 里吗?
  • 如果是tkinter,那么你可以使用root.after(5000, function_name)在5000ms(5s)后运行函数。而function_name 表示没有() 的函数名称(所谓的callback
  • 你有错误的缩进,所以我们不能说这段代码是如何工作的。编辑问题,再次输入代码,选择代码并使用Ctrl+K 正确格式化代码。
  • @tstoev : Filter() 实际上是将 SQL 查询的结果提供给小部件 (tk.treeview)。到目前为止一切正常,但树视图仅在消息框被回答后刷新。就好像消息框正在阻止代码在后台运行。但由于 Filter() 调用在消息框之前,我不明白为什么......
  • @furas:感谢您的回复,但我正试图做相反的事情,我不想延迟 Filter() 调用,试图给它一些时间继续但弹出消息框当我调用 update_contact_from_crm_to_import_in_365 时,windows 几乎立即出现。

标签: python function tkinter timing


【解决方案1】:

我无法运行它,但问题可能是 mainloop 首先运行函数 update_contact_from_crm_to_import_in_365 并等待它结束,然后它会更新寡妇中的小部件。这样一来,它可以立即更新所有小部件,从而减少窗口闪烁。

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

  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()
    

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

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2019-06-16
    • 2020-03-18
    • 2016-05-10
    相关资源
    最近更新 更多