Python不等待返回函数,并且在没有响应时继续

e7arh2l6  于 2023-01-08  发布在  Python
关注(0)|答案(2)|浏览(309)

我在Tkinter中有一个将文件保存到用户计算机的函数。如果用户试图保存一个已经存在的文件,我会尝试为用户创建一个提示,询问他们是否要覆盖现有文件。我不会包括整个代码,因为它有3000多行,但我尝试做的一个示例:
第一个月

def overWritePrompt():
    promptFrame = tk.Frame(maniWin, bg=_blk)
    promptFrame.place(relx=.4,rely=.2,relheight=.1,relwidth=.2)

    promptHead = tk.Label(promptFrame, bg=_blk, fg=_wht, text="Overwrite existing route?")
    promptHead.place(relx=0,rely=0,relheight=.4,relwidth=1)
    
    promptYes = tk.Button(promptFrame, bg=_dgrn, fg=_wht, text="Yes", relief="sunken", activebackground=_dgrn, activeforeground=_wht, command=lambda:(selection(True)), borderwidth=0)
    promptYes.place(relx=.1,rely=.5,relheight=.4,relwidth=.35)
    
    promptNo = tk.Button(promptFrame, bg=_red, fg=_wht, text="No", relief="sunken", activebackground=_red, activeforeground=_wht, command=lambda:(selection(False)), borderwidth=0)
    promptNo.place(relx=.45,rely=.5,relheight=.4,relwidth=.35)

    def selection(response):
        promptFrame.destroy()
        return response

def saveFile(fileName):
    overwrite = False
    if os.path.exists(os.path.join(directory, fileName)):
        overwrite = overwritePrompt()
    if overwrite:
        os.path.remove(fileName)
        os.path.save(fileName) 
    else:
        os.path.save(fileName)

我希望它向用户显示提示,并在继续保存部分之前等待响应,但是它只是立即返回None作为覆盖布尔值,并继续执行其余代码。
为什么overwrite = overwritePrompt()不在继续之前等待overWritePrompt()返回
我试过在不同的地方添加while循环,以防止代码在用户输入答案之前继续运行,但这只是完全冻结了应用程序。

mzsu5hc0

mzsu5hc01#

嵌套函数selection()根本不与外部函数overwritePrompt进行迭代,因此它的return语句不会影响外部函数返回的值。selection()在这方面与其他函数一样,只是一个普通函数。
你可以使用一个内置的Tk消息框来简化整个过程:

def saveFile(fileName):
    if os.path.exists(os.path.join(directory, fileName)):
        overwrite = tkinter.messagebox.askokcancel("Confirm", "Overwrite file?")
        if overwrite:
            os.path.remove(fileName)
    os.path.save(fileName)
m4pnthwp

m4pnthwp2#

我找到的解决方案是使用“保存”按钮,首先调用overWritePrompt()***,然后让提示符检查文件是否存在,然后将用户输入的结果传递给saveFile()函数。

def overWritePrompt(fileName):
    promptFrame = ""

    def clearPrompt():
        promptFrame.destroy()

    if os.path.exists(os.path.join(directory, fileName)):
        promptFrame = tk.Frame(maniWin, bg=_blk)
        promptFrame.place(relx=.4,rely=.2,relheight=.1,relwidth=.2)

        promptHead = tk.Label(promptFrame, bg=_blk, fg=_wht, text="Overwrite existing route?")
        promptHead.place(relx=0,rely=0,relheight=.4,relwidth=1)
        
        promptYes = tk.Button(promptFrame, bg=_dgrn, fg=_wht, text="Yes", relief="sunken", activebackground=_dgrn, activeforeground=_wht, command=lambda:(clearPrompt, saveFile(fileName, True)), borderwidth=0)
        promptYes.place(relx=.1,rely=.5,relheight=.4,relwidth=.35)
        
        promptNo = tk.Button(promptFrame, bg=_red, fg=_wht, text="No", relief="sunken", activebackground=_red, activeforeground=_wht, command=lambda:(clearPrompt, saveFile(fileName, False)), borderwidth=0)
        promptNo.place(relx=.45,rely=.5,relheight=.4,relwidth=.35)

    else: saveFile(fileName, False)

def saveFile(fileName, overwrite):
    if overwrite:
        os.path.remove(fileName)
        os.path.save(fileName) 
    else:
        os.path.save(fileName)

相关问题