如何从类中的函数打印返回值

时间:2015-09-04 20:42:23

标签: python function tkinter return return-value

我正在构建一个比较两个文件的简单程序。我现在已经为程序完成了主要代码,我正在为它实现GUI。

所以我的问题出现在尝试按下按钮时按下将允许用户选择文件然后读取该文件。这是一个功能。另一个按钮将比较两个文件,一个是用户选择的文件,另一个是另一个文件。所以这是另一个功能。所以我需要第一个函数的返回值将它输入到另一个函数中。

from Tkinter import *
from tkFileDialog import *




def make_dict(data):
    return dict((line.split(None, 1)[0], line)for line in data)


class myButtons:
    def __init__(self, master):
        firstFrame = Frame(master)
        firstFrame.pack()

        self.openLogButton = Button(firstFrame, text="Browse", command=self.getFileInfo)
        self.openLogButton.pack()

        self.printButton = Button(firstFrame, text="Print", command=self.compareAction)
        self.printButton.pack()

        self.quitButton = Button(firstFrame, text="Quit", command=firstFrame.quit)
        self.quitButton.pack()

        self.scroll = Scrollbar(firstFrame)
        self.inputText = Text(firstFrame, height=4, width=50)

        self.scroll.pack(side=RIGHT, fill=Y)
        self.inputText.pack(side=LEFT, fill=Y)

        self.scroll.config(command=self.inputText.yview)
        self.inputText.config(yscrollcommand=self.scroll.set)

        self.logFile = self.getFileInfo()

        thisIsTest = self.getFileInfo

    def printMessage(self):
        print "This works"
        test = self.inputText.get("1.0", END)
        print test

    def getFileInfo(self):
        return askopenfile(mode='rb')

    def compareAction(self):
        def process(infile, outfile, keywords):
            keys = [[k[0], k[1], 0] for k in keywords]
            endk = None
            with open(infile, 'rb') as fdin:
                with open(outfile, 'ab') as fdout:
                    fdout.write("<" + words + ">" + "\r\n")
                    for line in fdin:
                        if endk is not None:
                            fdout.write(line)
                            if line.find(endk) >= 0:
                                fdout.write("\r\n")
                                endk = None
                        else:
                            for k in keys:
                                index = line.find(k[0])
                                if index >= 0:
                                    fdout.write(line[index + len(k[0]):].lstrip())
                                    endk = k[1]
                                    k[2] += 1
            if endk is not None:
                raise Exception(endk + "Not found before end of file")
            return keys
        start_token = self.inputText.get("1.0", END)
        end_token = "[+][+]"
        split_start = start_token.split(' ')
        outputText = 'test.txt'

        print self.logFile

        # for words in split_start:
        #     process(self.getFileInfo, outputText, split_start)


root = Tk()
b = myButtons(root)

root.mainloop()

目前我只是想测试我的compareAction函数是否收到getFileInfo函数的返回值。到目前为止,当我尝试print self.getFileInfo时,我会对此结果进行处理:<bound method myButtons.getFileInfo of <__main__.myButtons instance at 0x100863ef0>>

我认为是函数的内存地址,而不是函数读取文件时的值。

这个想法很简单。用户选择一个文件打开,该文件打开并读取,然后在compareaction中使用该返回值后返回。

2 个答案:

答案 0 :(得分:1)

我能想到解决这个问题的最好方法是添加另一个功能。尝试将getFileInfo(self)更改为:

def getFileInfo(self):
    global filename
    filename = askopenfilename()
    return open(filename, mode="rb")

它基本上与您之前的函数做同样的事情,除了它使文件全局。然后创建另一个名为getFileName(self)的函数。

def getFileName(self):
    return filename

现在调用process函数时,请使用self.getFileName而不是self.getFileInfo:

process(self.getFileName, outputText, split_start)

如果您想知道为何获得绑定方法输出,可能是因为您打开文件而不是读取它。基本上当你运行print self.logFile时,它会返回一个文件对象。当我尝试在桌面上打印一个打开的文件时发生这种情况:

#Input
print askopenfile(mode="rb")

#Output
<open file u'C:/Users/User/Desktop/stuff.txt', mode 'rb' at 0x029BA078>

这是我打印文件并使用read()时发生的事情:

#Input
print askopenfile(mode="rb").read()

#Output
These are words in the file stuff.txt.

本文档here可以很好地了解文件及其工作原理。还要记得在完成阅读后关闭文件以防止出现其他问题。

答案 1 :(得分:0)

您只需将print self.getFileInfo更改为print self.getFileInfo()即可。请记住,使用括号是您调用函数的方式。也可以在代码中的任何其他位置执行此操作。请注意,这将再次调用该函数。您可以改为print self.logFile来查看结果。