在两个函数之间传递变量

时间:2015-03-03 19:26:18

标签: python tkinter

以下是我一段时间以来一直在研究的一段代码。我已经能够无错误地编译和运行代码。但是,我在代码中将变量从一个函数传递到另一个函数时遇到了困难。

在我运行choose()并根据所需索引创建self.newLists后,问题似乎就出现了。您会注意到我在此功能的末尾添加了print(self.newLists),以便我可以检查它是否正在生成我想要的内容。

下一个函数simplify()是我的问题出现的地方。当我尝试从前一个函数传递self.newLists时,它似乎没有产生任何东西。我还尝试打印和/或返回名为answer的变量,但它返回"无"。我已经绊倒了这个障碍一段时间没有任何进展。下面是我正在处理的代码以及我希望simplify()生成的示例。

from tkinter import *
from tkinter.filedialog import askopenfilename

class myFileOpener:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        print()
        self.newLists = ()

        self.printButton = Button(frame, text="Select File", command=self.openfile)
        self.printButton.pack(side=LEFT)

        self.runButton = Button(frame, text="Run", command=self.combine)
        self.runButton.pack(side=LEFT)

        self.quitButton = Button(frame, text="Quit", command=frame.quit)
        self.quitButton.pack(side=LEFT)

    def openfile(self):
        filename = askopenfilename(parent=root)
        self.lines = open(filename)
        # print(self.lines.read())

    def choose(self):
        g = self.lines.readlines()
        for line in g:
            matrix = line.split()
            JD = matrix[2]
            mintime = matrix[5]
            maxtime = matrix[7]
            self.newLists = [JD, mintime, maxtime]
            print(self.newLists)

    def simplify(self):
        dates = {}
        for sub in self.newLists:
            date = sub[0]
            if date not in dates:
                dates[date] = []
            dates[date].extend(sub[1])
        answer = []
        for date in sorted(dates):
            answer.append([date] + dates[date])
        return answer

    def combine(self):
        self.choose()
        self.simplify()


root = Tk()
b = myFileOpener(root)

root.mainloop()

simplify()所需输出的示例:

[['2014-158', '20:07:11.881', '20:43:04.546', '20:43:47.447', '21:11:08.997', '21:11:16.697', '21:22:07.717'],
 ['2014-163', '17:12:09.071', '17:38:08.219', '17:38:28.310', '17:59:25.649', '18:05:59.536', '18:09:53.243', '18:13:47.671', '18:16:53.976', '18:20:31.538', '18:23:02.243']]

它基本上按特定日期分组。

1 个答案:

答案 0 :(得分:2)

您没有制作列表清单。你是重置 self.newLists每个循环迭代,到一个包含3个元素的列表:

for line in g:
    matrix = line.split()
    JD = matrix[2]
    mintime = matrix[5]
    maxtime = matrix[7]
    self.newLists = [JD, mintime, maxtime]

您需要使用list.append()将这3个元素添加到您在循环之外设置一次的列表中:

self.newLists = []
for line in g:
    matrix = line.split()
    JD = matrix[2]
    mintime = matrix[5]
    maxtime = matrix[7]
    self.newLists.append([JD, mintime, maxtime])

您的simplify方法是将mintime个别字符添加到您的输出列表中:

for sub in self.newLists:
    date = sub[0]
    if date not in dates:
        dates[date] = []
    dates[date].extend(sub[1])

您希望在list.append()使用list.extend(),而不是dict.setdefault()。可以使用for date, mintime, maxtime in self.newLists: dates.setdefault(date, []).append(mintime) 简化该循环,而不是手动测试密钥:

{{1}}