我有两个按钮来存储打开文件的路径,但我觉得这个过程是重复代码并使用全局。我想知道是否有办法在函数中返回并将返回值存储在变量中。
这是我目前的代码
browsebutton = Button(root, text="This Week's Report", command=getFilecurrent)
browsebutton.grid(row=0, column=0)
browsebutton2 = Button(root, text="Last Week's Report", command=getFilepast)
browsebutton2.grid(row=0, column=1)
def getFilecurrent():
global path
# open dialog box to select file
path = filedialog.askopenfilename(initialdir="/", title="Select file")
def getFilepast():
global pathpast
# open dialog box to select file
pathpast = filedialog.askopenfilename(initialdir="/", title="Select file")
理想情况下,我在考虑做这样的事情
def getFilepath():
# open dialog box to select file
path = filedialog.askopenfilename(initialdir="/", title="Select file")
return path
以某种方式存储返回路径到变量。这样,我只需要一个路径存储函数,而不必使用全局变量。
答案 0 :(得分:1)
通常,您尝试做的事情是个好主意。但它在这种情况下不会起作用。调用getFilepast
的代码不是你写的东西,它是代码深入tkinter的内容,而且它不知道如何处理你返回它的路径。< / p>
处理这个问题的常用方法是创建一个类,并将值存储为类的实例,如下所示:
class PathyThing:
def __init__(self):
self.browsebutton2 = Button(root, text="Last Week's Report", command=self.getFilepast)
self.browsebutton2.grid(row=0, column=1)
# etc.
def getFilepast(self):
# open dialog box to select file
self.pathpast = filedialog.askopenfilename(initialdir="/", title="Select file")
# etc.
pathy = PathyThing()
现在,pathy
的任何其他方法都可以看到self.pathpast
。
通常,您希望将此类设为tkinter.Frame
之类的子类,然后创建PathyFrame
而不是普通Frame
。在大多数tkinter教程中都有这样的例子。
我想你可能也想创建一个能够同时处理两个按钮的功能。回调。您可以使用partial
向函数传递额外的参数来实现。但是在你的例子中,你有点卡住 - 这两个函数之间唯一真正的区别在于它们设置了哪个变量,并且没有很好的方法来传递这些信息。但是,通常,您希望实际做某事,而不仅仅是将值存储在变量中。例如,假设我们想要从报告文件中读取第一行并设置标签的内容以与之匹配。那么我们就可以解决一些问题了:
from functools import partial
def getPath(label):
path = filedialog.askopenfilename(initialdir='/', title="Select file")
with open(path) as f:
firstline = next(f)
label.config(text=firstline)
label = Label(root)
label.grid(row=1, column=0)
browsebutton = Button(root, text="This Week's Report", command=partial(getFile, label))
browsebutton.grid(row=0, column=0)
label2 = Label(root)
label.grid(row=1, column=1)
browsebutton2 = Button(root, text="Last Week's Report", command=partial(getFile, label2))
browsebutton2.grid(row=0, column=1)