簡體   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