如何将Tkinter函数内用户输入的变量传递给外部Python脚本并获取返回值
问题根源
你现在的实现有两个核心问题:
Image_files.py中的逻辑都是顶层执行代码,datadate是固定写死的常量,无法接收外部传入的动态参数- 直接在函数里
import Image_files只会在首次导入时执行一次代码,后续点击按钮不会重新执行逻辑,也拿不到新参数对应的返回值
第一步:修改Image_files.py,把逻辑封装为可传参的函数
把整个脚本的逻辑封装成带参数的函数,执行完成后返回你需要的四个变量,同时优化路径处理和排序逻辑:
import os def get_file_info(datadate: str): base_path = "/home/abhra/Documents/My_first_code/" filepath = os.path.join(base_path, datadate) # 读取TSeries开头的文件列表 filelist = os.listdir(filepath) list1 = [f for f in filelist if f.startswith("TSeries")] # 优化数字排序,解决你注释里提到的排序不准问题 list1.sort(key=lambda x: int(x.replace("TSeries", ""))) # 读取PP_FILES路径下的文件 filepath2 = os.path.join(filepath, "PP_FILES") filelist2 = os.listdir(filepath2) filelist2.sort(key=lambda x: int(''.join(filter(str.isdigit, x))) if any(c.isdigit() for c in x) else x) # 返回四个需要的变量 return filepath, filepath2, list1, filelist2
第二步:修改主GUI代码,调用封装好的函数
清理冗余的全局变量,直接在按钮触发的函数里调用上面封装好的方法,拿到的变量可以存起来供后续逻辑使用:
import tkinter as tk from tkinter import StringVar, Label, Entry, Button # 提前导入封装好的函数 from Image_files import get_file_info main_gui = tk.Tk() main_gui.title("Widefield Analysis") main_gui.geometry("600x500") datadate = StringVar() # 用来存后续要用到的四个返回变量 global_file_info = None def on_done_click(): global global_file_info # 拿到用户输入的日期 input_date = datadate.get().strip() if not input_date: # 可按需添加空值提示弹窗 return # 调用函数拿到四个变量 filepath, filepath2, list1, filelist2 = get_file_info(input_date) # 存到全局变量里,后续其他逻辑直接用 global_file_info = { "filepath": filepath, "filepath2": filepath2, "list1": list1, "filelist2": filelist2 } # 可自行添加执行成功提示,以下为测试打印代码 print("参数获取成功:", global_file_info) # 后续其他脚本逻辑直接调用global_file_info里的变量即可 # 界面元素 ddate_label = Label(main_gui, text='Enter Data Date', font='Ariel 13 bold') ddate_label.place(x=20, y=13) date_entry = Entry(main_gui, textvariable=datadate, font='Ariel 13 normal', width=10) date_entry.place(x=205, y=10) button1 = Button(main_gui, text="Done", font="Ariel 13 bold", command=on_done_click) button1.place(x=500, y=450) main_gui.mainloop()
注意事项
- 你后续要用到四个变量的时候,直接读
global_file_info里对应的键值即可 - 如果要避免用户输入的日期对应的路径不存在,可以在
get_file_info函数里加os.path.exists判断,提前抛出错误提示 - 原来代码里的
sorted(list1)写法不会修改原列表,优化后的排序规则可以适配数字开头的文件名排序需求
内容的提问来源于stack exchange,提问作者Ajax_567
相关产品推荐
相关产品推荐

