tkinter - 如何使用输入到 Entry 小部件中的文件路径作为变量?

tkinter - How to use file path entered into Entry widget as a variable?

我有这个生成 Entry 小部件和 Button 小部件的 GUI。用户应该输入一个文件路径(例如 "C:\Users\example\example")并且该文件路径用作函数 LoopAnalysis().

的变量

当我执行代码时,小部件可以工作,我可以将文件路径复制并粘贴到 Entry 小部件中,但是当我使用 Button 小部件执行命令时,我得到以下信息错误:

FileNotFoundError: [WinError 3] The system cannot find the path specified: ''

如果用户在Entry window中输入一个文件路径,是否有特定的语法将其用作变量?例如,我知道对于 python 一般来说,如果我手动定义一个变量。

Directory = r'C:\Users\example\example'

我需要在 python 的文件路径前添加 r 以将整行识别为文件路径,而不考虑文件路径中的特殊字符。

如何为我的函数执行此操作?

Torque_Analysis 已经定义并且可以正常工作。

ws = Tk()
ws.title("Torque Analysis")
ws.geometry('1000x150')
ws['bg'] = 'black'

def LoopAnalysis(Directory):
    for filename in os.listdir(Directory):
        if filename.endswith(".csv"):
            Torque_Analysis(os.path.join(Directory, filename))
            plt.figure()
            plt.show(block = False)
        else: continue

UserEntry = Entry(ws, width = 150)
UserEntry.pack(pady=30)
Directory = UserEntry.get()

Button(ws,text="Click Here to Generate Curves", padx=10, pady=5, command=lambda: LoopAnalysis(Directory)).pack()

ws.mainloop()

如对该问题的评论所述,程序一启动,您就调用 UserEntry.get() 一次。然后输入框是空白的,所以空字符串被读取并存储在Directory中,Directory的内容再也不会改变。

相反,您需要在每次按下按钮时调用 UserEntry.get()

试试这个:

from tkinter import *
import os

ws = Tk()
ws.title("Torque Analysis")
ws.geometry('1000x150')
ws['bg'] = 'black'

def LoopAnalysis(Directory):
    for filename in os.listdir(Directory):
        if filename.endswith(".csv"):
            Torque_Analysis(os.path.join(Directory, filename))
            plt.figure()
            plt.show(block = False)
        else: continue

UserEntry = Entry(ws, width = 150)
UserEntry.pack(pady=30)
Button(ws,text="Click Here to Generate Curves", padx=10, pady=5, command=lambda: LoopAnalysis(UserEntry.get())).pack()

ws.mainloop()

您在创建条目小部件后立即调用 get 方法,因此它会 return 一个空字符串。在 GUI 编程中,您需要在需要数据的时候从小部件中获取数据,而不是之前。

我的建议是不要将值传递给函数。相反,让函数调用 get:

Button(..., command=LoopAnalysis)
...
def LoopAnalysis():
    Directory = UserEntry.get()
    ...