Tkinter按钮命令仅在启动时调用?

我正在尝试使用Tkinter来构建一个简单的图形用户界面应用程序,它可以导入数据并执行一些分析。图形用户界面只有四个标签和四个并排的按钮。当您按下按钮时,您应该会看到一个文件对话框提示。然而,每当我运行该脚本时(见下文),Python在启动时调用所有按钮命令,然后按钮就不起作用了。即使我不使用类来编写代码,同样的事情也会发生。我怎么才能让它停止这样做?谢谢!

选择 | 换行 | 行号
  1. import numpy
  2. import scipy
  3.  
  4. from Tkinter import *
  5. import tkFileDialog as tkf
  6.  
  7. filenames = {}
  8.  
  9. class App:
  10.     def __init__(self, master):
  11.  
  12.             frame = Frame(master)
  13.             frame.pack()
  14.  
  15.             self.Name0 = Label(frame, text = "Initial Data", width=30).grid(row=0, sticky=W,columnspan=2)
  16.             self.Name1 = Label(frame, text = "After Change #1", width=30).grid(row=1, sticky= W,columnspan=2)
  17.             self.Name2 = Label(frame, text = "After Change #2", width=30).grid(row=2,sticky=W,columnspan=2)
  18.             self.Name3 = Label(frame, text = "Current State", width=30).grid(row=3,sticky=W,columnspan=2)
  19.  
  20.             self.Butt0 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=0,column=2)
  21.             self.Butt1 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=1,column=2)
  22.             self.Butt2 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=2,column=2)
  23.             self.Butt3 = Button(frame, text = "Select", command=tkf.askopenfile()).grid(row=3,column=2)
  24.  
  25.  
  26. root = Tk()
  27.  
  28. app = App(root)
  29.  
  30. root.mainloop()
  31.  
# 回答1


在命令语句中去掉括号。Tkinter假设它是一个函数,因此添加了括号本身。

选择 | 换行 | 行号
  1.              self.Butt0 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=0,column=2)
  2.              self.Butt1 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=1,column=2)
  3.              self.Butt2 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=2,column=2)
  4.              self.Butt3 = Button(frame, text = "Select", command=tkf.askopenfile).grid(row=3,column=2) 

但是,如何存储所选的文件名呢?您应该调用一个函数,该函数调用askOpenFile[name?]并存储所选的名称。您可以对所有按钮使用相同的功能,只需向其发送按钮编号即可。此外,GRID()返回NONE,因此没有理由保存按钮ID。

选择 | 换行 | 行号
  1. from Tkinter import *
  2. import tkFileDialog as tkf
  3. from functools import partial
  4.  
  5. class App:
  6.     def __init__(self, master):
  7.  
  8.              frame = Frame(master)
  9.              frame.pack()
  10.  
  11.              self.Name0 = Label(frame, text = "Initial Data", width=30).grid(row=0, sticky=W,columnspan=2)
  12.              self.Name1 = Label(frame, text = "After Change #1", width=30).grid(row=1, sticky= W,columnspan=2)
  13.              self.Name2 = Label(frame, text = "After Change #2", width=30).grid(row=2,sticky=W,columnspan=2)
  14.              self.Name3 = Label(frame, text = "Current State", width=30).grid(row=3,sticky=W,columnspan=2)
  15.  
  16.              self.Butt0 = Button(frame, text = "Select", command=partial(self.get_file_name, 0)).grid(row=0,column=2)
  17.              print self.Butt0
  18.              Button(frame, text = "Select", command=partial(self.get_file_name, 1)).grid(row=1,column=2)
  19.              Button(frame, text = "Select", command=partial(self.get_file_name, 2)).grid(row=2,column=2)
  20.              Button(frame, text = "Select", command=partial(self.get_file_name, 3)).grid(row=3,column=2)
  21.  
  22.     def get_file_name(self, button_num):
  23.         fname=tkf.askopenfilename()
  24.         print "name for button %d is %s" % (button_num, fname)
  25.  
  26. root = Tk()
  27.  
  28. app = App(root)
  29.  
  30. root.mainloop() 
# 回答2


哦,哇,这真的很管用。是的,我计划存储文件名,但我只是在测试它。我仍然不明白为什么圆括号会导致立即调用按钮命令,然后再也不会调用。无论如何,非常感谢!
# 回答3


这将执行对函数的调用,并将命令设置为函数的返回值,如果您愿意,可以这样做,但我想不出有任何理由会有人想要这样做。
# 回答4


当按钮被按下时,您可能希望将一个值传递给函数。在这种情况下,您可以使用lambda或闭包。Lambda示例:

选择 | 换行 | 行号
  1. command=lambda: tkf.askopenfile(file_name_variable1)

标签: python

添加新评论