在Tkinter中使用按钮调用函数后返回值
from Tkinter import *
from tkFileDialog import askopenfilename
from PIL import Image
def main():
filename = askopenfilename(filetypes=[("Jpeg","*.jpg")])
return filename
root = Tk()
button = Button(root,text="Open",command=main)
button.pack()
root.title("Image Manipulation Program")
root.mainloop()
我对编程还不是很熟悉,但我正在尝试通过Tkinter这个图形界面库制作一个图像程序。在上面的代码中,我需要把存储在filename里的字符串返回,这样它就能在程序的全局范围内使用。问题是,当我通过按钮调用这个函数时,我不知道该怎么做。我在网上找不到这个问题的答案,所以希望有人能帮我解决这个问题。
2 个回答
6
如果你使用基于类的方法来创建Tk应用程序,而不是从事件处理函数中返回值,你可以把这些值赋给实例变量。这是最好的方法,因为基于函数的图形用户界面应用程序扩展性不好,主要是因为需要把东西放在模块的全局范围内。
from Tkinter import *
class Application(Frame):
def main(self):
self.filename = askopenfilename(filetypes=[("Jpeg","*.jpg")])
def createWidgets(self):
self.button = Button(root,text="Open",command=self.main)
self.button.pack()
def __init__(self, master=None):
Frame.__init__(self, master)
self.filename = None
self.pack()
self.createWidgets()
root = Tk()
root.title("Image Manipulation Program")
app = Application(master=root)
app.mainloop()
2
通常来说,使用全局变量来在程序中传递信息是不太好的做法。不过,如果你真的需要这么做,可以使用可变的数据类型(比如列表或字典)作为全局变量,并在你的回调函数main
中修改它的内容。
returned_values = {} # Create an empty dict.
def main():
returned_values['filename'] = askopenfilename(filetypes=[("Jpeg","*.jpg")])
# returned_values['filename'] may now be accessed in the global scope.
如果你打算经常这样做,考虑自己创建一个类来传递信息。