我正在尝试使用Tkinter来构建一个简单的图形用户界面应用程序,它可以导入数据并执行一些分析。图形用户界面只有四个标签和四个并排的按钮。当您按下按钮时,您应该会看到一个文件对话框提示。然而,每当我运行该脚本时(见下文),Python在启动时调用所有按钮命令,然后按钮就不起作用了。即使我不使用类来编写代码,同样的事情也会发生。我怎么才能让它停止这样做?谢谢!
- import numpy
- import scipy
-
- from Tkinter import *
- import tkFileDialog as tkf
-
- filenames = {}
-
- class App:
- def __init__(self, master):
-
- frame = Frame(master)
- frame.pack()
-
- self.Name0 = Label(frame, text = "Initial Data", width=30).grid(row=0, sticky=W,columnspan=2)
- self.Name1 = Label(frame, text = "After Change #1", width=30).grid(row=1, sticky= W,columnspan=2)
- self.Name2 = Label(frame, text = "After Change #2", width=30).grid(row=2,sticky=W,columnspan=2)
- self.Name3 = Label(frame, text = "Current State", width=30).grid(row=3,sticky=W,columnspan=2)
-
- self.Butt0 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=0,column=2)
- self.Butt1 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=1,column=2)
- self.Butt2 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=2,column=2)
- self.Butt3 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=3,column=2)
-
-
- root = Tk()
-
- app = App(root)
-
- root.mainloop()
-
# 回答1
在命令语句中去掉括号。Tkinter假设它是一个函数,因此添加了括号本身。
- self.Butt0 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=0,column=2)
- self.Butt1 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=1,column=2)
- self.Butt2 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=2,column=2)
- self.Butt3 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=3,column=2)
但是,如何存储所选的文件名呢?您应该调用一个函数,该函数调用askOpenFile[name?]并存储所选的名称。您可以对所有按钮使用相同的功能,只需向其发送按钮编号即可。此外,GRID()返回NONE,因此没有理由保存按钮ID。
- from Tkinter import *
- import tkFileDialog as tkf
- from functools import partial
-
- class App:
- def __init__(self, master):
-
- frame = Frame(master)
- frame.pack()
-
- self.Name0 = Label(frame, text = "Initial Data", width=30).grid(row=0, sticky=W,columnspan=2)
- self.Name1 = Label(frame, text = "After Change #1", width=30).grid(row=1, sticky= W,columnspan=2)
- self.Name2 = Label(frame, text = "After Change #2", width=30).grid(row=2,sticky=W,columnspan=2)
- self.Name3 = Label(frame, text = "Current State", width=30).grid(row=3,sticky=W,columnspan=2)
-
- self.Butt0 = Button(frame, text = "Select", command=partial(self.get_file_name, 0)).grid(row=0,column=2)
- print self.Butt0
- Button(frame, text = "Select", command=partial(self.get_file_name, 1)).grid(row=1,column=2)
- Button(frame, text = "Select", command=partial(self.get_file_name, 2)).grid(row=2,column=2)
- Button(frame, text = "Select", command=partial(self.get_file_name, 3)).grid(row=3,column=2)
-
- def get_file_name(self, button_num):
- fname=tkf.askopenfilename()
- print "name for button %d is %s" % (button_num, fname)
-
- root = Tk()
-
- app = App(root)
-
- root.mainloop()
# 回答2
哦,哇,这真的很管用。是的,我计划存储文件名,但我只是在测试它。我仍然不明白为什么圆括号会导致立即调用按钮命令,然后再也不会调用。无论如何,非常感谢!
# 回答3
这将执行对函数的调用,并将命令设置为函数的返回值,如果您愿意,可以这样做,但我想不出有任何理由会有人想要这样做。
# 回答4
当按钮被按下时,您可能希望将一个值传递给函数。在这种情况下,您可以使用lambda或闭包。Lambda示例:
- command=lambda: tkf.askopenfile(file_name_variable1)