繁体   English   中英

使用 python function 的一部分的结果并存储在 function 外部的变量中

[英]Using the result from part of a python function and store in variable outside function

In my program I am calling a function that imports.csv data into a treeview using tkinter and csv module. 仅在使用Import按钮时才调用 Function。 import按钮链接到 function select_input_file function 按预期工作,csv 数据导入我的treeview没有任何问题。 从这里我想将一些 function 结果存储到 function 之外的variables中。 例如input_file_path只有在调用 function 并导入文件时才会包含一个值。 还将数据导入Ro Number, Rego Number列。 我曾尝试使用return()但它会阻止 function 继续运行。 我也阅读了yield ,但通过文档我不确定这是否是我最好的选择。 我认为一个解决方案可能是使用return()然后for in rdr:在每次返回之后select_input_file function 继续但我确定有更好的方法吗? 我已经将代码削减到我认为必要的程度。

import tkinter as tk
from tkinter import *
import tkinter.ttk as tkrttk
import csv


root = tk.Tk()

treetime = tkrttk.Treeview(root)
treetime['columns'] = ("Column2", "Column3", "Column4", "Column5",
                       "Column6", "Column7", "Column8", "Column9", "Column10", "Column11")

def select_input_file():
            input_file_path = filedialog.askopenfilename(
                filetypes=(("CSV files", "*.csv"),))
            with open(input_file_path) as csv_file:
              rdr = csv.DictReader(csv_file)
              for row in rdr:
                 RoNumber = row['Ro Number']
                 DateIn = row['Date In']
                 TimeIn = row['Time In']
                 TimeOut = row['Time Out']
                 RegoNumber = row['Rego Number']
                 CustomerName = row['Customer Name']
                 VehicleMake = row['Vehicle Make']
                 VehicleModel = row['Vehicle Model']
                 JobDescription = row['Job Description']
                 CurrentStatus = row['Current Status']

                 treetime.insert("", 0, values=(RoNumber, DateIn, TimeIn, TimeOut, RegoNumber,
                                           CustomerName, VehicleMake, VehicleModel, JobDescription, CurrentStatus))

menubar=Menu(root)
filemenu=Menu(menubar, tearoff=0)
filemenu.add_command(label="Import", command=select_input_file)
               
    root.mainloop()      

对于您的具体问题:您无法return并继续在 function 中执行。 您可以使用yield来获得这种效果,但我认为它会滥用语义,并且可能会让您在未来感到头疼。 可以return不止一件事:

def foo():
    return "Spam", 42

def bar():
    name, answer = foo()

这将允许您将(例如)从文件中选择的文件名和数据返回给调用 function。

更一般的评论:函数通常应该做一件事。 这使得它们更容易测试(目的很明确)并且更容易修改(如果有副作用的话)。 现在您的 function 正在获取用户输入(文件名),加载和解析文件内容,并更新控件。 您可能希望拥有单独的函数来执行这些不同的操作,并且只需通过单击“导入”时调用的简短 function 将其组合在一起。 您最初的问题也可能更容易以这种方式解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM