python - 如何执行依赖于在另一个 python gui 脚本中提取文件名的 python 脚本?
问题描述
我创建了一个 Python脚本NoShowCalc.py
(但是,我希望这一切都通过 GUI 执行,所以我启动了一个单独的 ( ) 脚本来创建一个带有浏览按钮的界面,该按钮将获取这些文件路径名,然后这将为我提供执行脚本所需的内容。一旦选择了这些 excel 文件,就会出现另一个按钮来执行脚本。然而,我做到了,它奏效了!但我不知道我改变了什么,现在两个不同的 py 文件没有连接。booked_file_path
arrived_file_path
vlookup_file_path
GUI.py
NoShowCalc.py
NoShowCalc.py
这是脚本中的NoShowGUI.py
脚本:
def open_file():
browse_text.set('Loading...')
booked_file_path = askopenfile(parent=root, mode='rb', title='Choose a file', filetype=[('CSV file', '*.csv')])
if booked_file_path:
read_csv = (booked_file_path)
browse_text.set('Loaded')
def run():
os.system('NoShow_Calc.py')
calculate_text.set("Calculating...")
#Calculate button
calculate_text = tk.StringVar()
calculate_btn = tk.Button(root, textvariable=calculate_text, command=lambda:run(), font='Calibri', fg='black', height=1, width=15)
calculate_text.set("Calculate No Show")
calculate_btn.grid(column=2, row=9)
这些是NoShowCalc.py
脚本中的第一行:
import pandas as pd
booked = pd.read_csv(booked_file_path, parse_dates=['Appointment Date'])
arrived = pd.read_csv(arrived_file_path, parse_dates=['Appointment Date'])
vlookup = pd.read_excel(vlookup_file_path)
不断弹出的错误是NameError: name 'booked_file_path' is not defined
。我不知道它之前是如何运行的,现在这个错误正在弹出,因为它不能再与其他 py 文件对话了。我做错了什么?
解决方案
如果您使用os.system()
或使用模块运行脚本subprocess
,则不能使用其他脚本中的变量。它们作为独立的进程运行,不能共享变量(或内存中的数据)
您只能发送一些文本值作为参数
os.system('NoShow_Calc.py ' + booked_file_path)
然后你可以NoShow_Calc
使用sys.argv
import pandas as pd
import sys
booked_file_path = sys.argv[1]
booked = pd.read_csv(booked_file_path, parse_dates=['Appointment Date'])
arrived = pd.read_csv(arrived_file_path, parse_dates=['Appointment Date'])
vlookup = pd.read_excel(vlookup_file_path)
如果您需要其他变量,那么您必须以相同的方式发送其他值
os.system('NoShow_Calc.py ' + booked_file_path + ' ' + other_filename)
和
booked_file_path = sys.argv[1]
other_filename = sys.argv[2]
# etc.
但是使用os.system()
你不能将结果booked, arrived, vlookup
从NoShow_Calc
to发送NoShowGUI
。
你可以这样做,subprocess
但它只能作为文本发送 - 所以NoShow_Calc
必须使用print()
来显示所有结果,并且NoShowGUI
必须将此文本解析为预期的结构 - 即。列表,字典,DataFrame
更好的是,您应该使用import
从中加载代码NoShow_Calc.py
,然后所有代码在同一进程中运行,因此所有代码都可以访问相同的变量——并且它不需要转换为文本并从文本返回。
为了使它更好,我将代码放入函数中
import pandas as pd
def my_function(booked_file_path, arrived_file_path, vlookup_file_path):
booked = pd.read_csv(booked_file_path, parse_dates=['Appointment Date'])
arrived = pd.read_csv(arrived_file_path, parse_dates=['Appointment Date'])
vlookup = pd.read_excel(vlookup_file_path)
return booked, arrived, vlookup
然后NoShowGUI
你可以导入它并像任何其他功能一样使用
from NoShow_Calc import my_function
booked, arrived, vlookup = my_function(booked_file_path, arrived_file_path, vlookup_file_path)
编辑:
我做了最少的工作代码。我把它减少到只有一个文件名。
NoShow_Calc.py
import pandas as pd
def calc(booked_file_path): #, arrived_file_path, vlookup_file_path):
booked = pd.read_csv(booked_file_path, parse_dates=['Appointment Date'])
#arrived = pd.read_csv(arrived_file_path, parse_dates=['Appointment Date'])
#vlookup = pd.read_excel(vlookup_file_path)
return booked #, arrived, vlookup
NoShowGUI.py
import tkinter as tk
from tkinter.filedialog import askopenfilename # instead of `askopenfile`
# adding directory with this script to `sys.path` before `import NoShow_Calc`
# to make sure that `import` will search `NoShow_Calc.py` in correct folder even when GUI will be run from different folder
import os
import sys
HOME_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(HOME_DIR)
import NoShow_Calc
print('HOME_DIR:', HOME_DIR)
def select_filename():
global booked_file_path # inform function that it has to assign value to external/global variable
text_log.insert('end', 'Selecting ...\n')
# use `askopenfilename` instead of `askopenfile`
# because I need only filename, not opened file (pandas will open it on its own)
booked_file_path = askopenfilename(parent=root,
title='Choose a file',
#initialdir='/home/furas',
filetypes=[('CSV file', '*.csv')])
if booked_file_path:
text_log.insert('end', f'Selected: {booked_file_path}\n')
else:
text_log.insert('end', f'Not selected\n')
def run():
text_log.insert('end', "Calculating...\n")
if booked_file_path is None:
text_log.insert('end', "File booked_file_path not selected !!!")
return
#elif arrived_file_path is None:
# text_log.insert('end', "File arrived_file_path not selected !!!")
# return
#elif vlookup_file_path is None:
# text_log.insert('end', "File vlookup_file_path not selected !!!")
# return
else:
root.update() # force tkinter to update text in text_log at once (not when it exits function `run`)
result = NoShow_Calc.calc(booked_file_path)# , arrived_file_path, vlookup_file_path)
text_log.insert('end', "Result:\n")
text_log.insert('end', str(result.head()) + "\n")
# --- main ---
booked_file_path = None # default value at start (so in `run` I can check `None` to see if I selecte filename)
#arrived_file_path = None
#vlookup_file_path = None
root = tk.Tk()
text_log = tk.Text(root)
text_log.grid(column=0, row=0)
select_btn = tk.Button(root, text="Select File Name", command=select_filename)
select_btn.grid(column=0, row=1)
calculate_btn = tk.Button(root, text="Calculate", command=run)
calculate_btn.grid(column=0, row=2)
root.mainloop()
推荐阅读
- function - 在lua中调用函数时使用多个括号
- swift - 使用iOS滑动删除不流畅
- javascript - Chart.js - 更改 x 轴时间序列的刻度/标签位置
- json - 如何将 OPENJSON 的结果合并到单个列表中并删除重复项?
- ssis - 为可重用性创建 ssis 模板时出现问题
- reactjs - 如何在 REACT 中传递 Props 并设置所选项目的 CART
- java - 如何使用 SiliCompressor 压缩视频和图像?
- javascript - 如何在 disord js 中下载和重新上传图像?
- excel - 如何删除excel中的部分重复项?
- python - Python 脚本在 PyCharm 中运行,但在任务计划程序 (Turbodbc) 中失败