Python 按钮激活时,Tkinter else子句在if语句之前执行

Python 按钮激活时,Tkinter else子句在if语句之前执行,python,if-statement,tkinter,Python,If Statement,Tkinter,我试图使delFile方法能够根据GUI中输入的内容从目录中删除文本文件。但是,当我按下按钮时,它只输出else子句messagebox delFile是一个名为quizEdit的类的方法。问题是,在创建条目小部件大约一毫秒后,甚至在用户看到条目小部件之前,您正在调用.get() 根据经验,GUI函数需要在需要时请求数据。在你的例子中,我会做一个专门为获取值而设计的回调,然后调用你的函数 def delFile(self, num): if os.path.exists("quiz"+s

我试图使delFile方法能够根据GUI中输入的内容从目录中删除文本文件。但是,当我按下按钮时,它只输出else子句messagebox


delFile是一个名为quizEdit的类的方法。

问题是,在创建条目小部件大约一毫秒后,甚至在用户看到条目小部件之前,您正在调用
.get()

根据经验,GUI函数需要在需要时请求数据。在你的例子中,我会做一个专门为获取值而设计的回调,然后调用你的函数

def delFile(self, num):
    if os.path.exists("quiz"+str(num)+".txt"):
        os.remove("quiz"+str(num)+".txt")
        tkinter.messagebox.showinfo("Removed!", "Quiz successfully Removed!")
    else:
        tkinter.messagebox.showinfo("Error!", "Quiz file not found!")

    if os.path.exists("answer"+(num)+".txt"):
        os.remove("answer"+(num)+".txt")
        tkinter.messagebox.showinfo("Removed!", "Answers successfully Removed!")
    else:
        tkinter.messagebox.showinfo("Error!", "Answer file not found!")

delete = quizEdit("a")
root = Tk()
root.geometry("450x320")
root.title("Remove a text file")

label1 = Label(root, text = "What to remove?")
label1.place(x=70, y = 140)

entry1 = Entry(root)
entry1.place(x = 180, y = 140)

et = entry1.get()

button1 = Button(root, text = "Remove", command=lambda : delete.delFile(et))
button1.place(x=210, y=200)


root.mainloop()

这不是唯一的解决方案,但对我来说是最干净的。您可以将命令设置为调用
get()
lambda
,但我发现这种模式更难理解,也更难调试。另一个选项是在
delFile
内部调用
get()
,但它将UI与
quizEdit
对象紧密耦合,这可能是可取的,也可能是不可取的

在创建条目大约一毫秒后,您正在调用
get()
方法。用户将没有机会输入任何数据。首先,您必须理解@BryanOakley好的,我通过简单地将get()方法作为参数而不是使用变量来修复它。谢谢。
...
def do_delete():
    num = entry1.get()
    delete.delFile(num)
...
button1 = Button(root, text = "Remove", command=do_delete)
...