Tkinter按钮命令在运行程序时激活?
我正在尝试制作一个构建检索表单,但在按钮方面遇到了一些问题……我对Python和tkinter的图形界面编程还很陌生(其实对图形界面编程整体都不太了解),所以我借用了一个“你好,世界”应用的基本框架,然后在这个基础上进行了一些修改。
在下面的代码中,我把“浏览”按钮的“命令”选项设置为在点击时调用我类里的get_dir()函数。然而,当我尝试运行这个应用时,get_dir()函数就会被自动调用,我被要求选择一个目录。你知道为什么会这样吗?我该怎么做才能让它正常工作呢?
from Tkinter import *
import tkFont
from tkFileDialog import askdirectory
class App:
def __init__(self, master):
fontHead = tkFont.Font(family="Arial", size=10, weight=tkFont.BOLD)
fontBold = tkFont.Font(family="Arial", size=8, weight=tkFont.BOLD)
fontReg = tkFont.Font(family="Arial", size=8)
frameN = Frame(master)
frameN.grid(row=0,padx=5,pady=5)
frameXBH = Frame(frameN)
frameXBH.grid(row=0,columnspan=5,padx=5)
Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=20,background="#cccccc").grid(row=0)
Label(frameXBH, text="Xbox 360",font=fontBold,width=9).grid(row=0,column=1)
Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=440,background="#cccccc").grid(row=0,column=2,sticky="WE")
Label(frameN, text="Destination Path:",font=fontReg).grid(row=1,sticky="W")
xbPath = Entry(frameN,width=30,font=fontReg)
xbPath.grid(row=1,column=1,sticky="W")
xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
xbBrowse.grid(row=1,column=2,sticky="W")
xbRel = Checkbutton(frameN,text="Release",font=fontReg)
xbRel.grid(row=1,column=3,sticky="W")
xbShip = Checkbutton(frameN,text="Ship",font=fontReg)
xbShip.grid(row=1,column=4,sticky="W")
Canvas(frameN,borderwidth=1,relief="groove",width=550,height=0).grid(row=2,columnspan=5,pady=10)
# SAVE AND CANCEL
btnSave = Button(frameN,text="Save",width=10)
btnSave.grid(row=3,column=3,sticky="E")
btnCancel = Button(frameN,text="Cancel",width=10)
btnCancel.grid(row=3,column=4,sticky="W")
def get_dir(self,box):
tmp = askdirectory(mustexist=1,title="Please select a destination")
tmp = tmp.replace("/","\\")
box.delete(0,END)
box.insert(0,tmp)
root = Tk()
root.resizable(0,0)
app = App(root)
root.mainloop()
3 个回答
9
你需要传递一个你自己写的 get_dir
方法的引用。
所以把
xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
改成
xbBrowse = Button(frameN,text="Browse...",font=fontReg, command=self.get_dir)
然后把你的 Entry
小部件变成一个实例变量,这样你就可以在 get_dir
方法里访问它了。
比如说:
self.xbPath = Entry(frameN,width=30,font=fontReg)
这样你的 get_dir()
方法就会变成:
def get_dir(self):
tmp = askdirectory(mustexist=1,title="Please select a destination")
tmp = tmp.replace("/","\\")
self.xbPath.delete(0,END)
self.xbPath.insert(0,tmp)
21
在上面的代码中:
xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
你已经在调用这个函数了,其实你应该只是传递这个函数:
xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir)
41
把你的事件处理器改成一个lambda函数,这样它可以用你想要的任何参数来调用你的get_dir()
函数:
xbBrowse = Button(frameN, text="Browse...", font=fontReg, command=lambda : self.get_dir(xbPath))