代码之家  ›  专栏  ›  技术社区  ›  Doktor J

Tkinter按钮命令在运行程序时激活?

  •  15
  • Doktor J  · 技术社区  · 15 年前

    在下面的代码中,我将Browse按钮的“command”选项设置为在单击时调用类的内部get\u 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 回复  |  直到 15 年前
        1
  •  33
  •   Pichi Wuana    9 年前

    使事件处理程序成为 get_dir() 无论你想要什么理由:

    xbBrowse = Button(frameN, text="Browse...", font=fontReg, command=lambda : self.get_dir(xbPath))
    
        2
  •  17
  •   pyfunc    15 年前

    xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
    

    如果您已经在调用函数,则只需传递函数:

    xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir)
    
        3
  •  9
  •   volting    15 年前

    你需要给你的朋友一份推荐信 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 控件一个实例变量,以便您可以在 获取目录

    例如

    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)