Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter按钮命令在运行程序时激活?_Python_User Interface_Tkinter - Fatal编程技术网

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

Python Tkinter按钮命令在运行程序时激活?,python,user-interface,tkinter,Python,User Interface,Tkinter,我正在尝试创建一个构建检索表单,但似乎按钮有问题。。。我是Python/tkinter GUI编程(以及一般的GUI编程)的新手,借用了Hello World应用程序的框架,并以此为基础进行了构建 在下面的代码中,我设置了浏览按钮的“command”选项,以在单击时调用类的内部get_dir()函数。但是,只要我尝试运行应用程序,就会调用get_dir()函数,并提示我选择一个目录。知道为什么会发生这种情况吗?我能做些什么使它正常运行 from Tkinter import * import t

我正在尝试创建一个构建检索表单,但似乎按钮有问题。。。我是Python/tkinter GUI编程(以及一般的GUI编程)的新手,借用了Hello World应用程序的框架,并以此为基础进行了构建

在下面的代码中,我设置了浏览按钮的“command”选项,以在单击时调用类的内部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()
在上述代码中:

xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
您已经在调用函数了,应该只是传递函数:

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

您需要传递
get\u dir
方法的引用

所以改变

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

然后将
条目
小部件作为实例变量,以便可以在
get_dir
方法中访问它

e、 g

然后您的
get\u 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)
将事件处理程序设置为lambda函数,该函数使用所需的任何参数调用
get\u dir()

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

@Doktor J:你不需要传递对xbPath的引用,看看我的回答我打算在表单上有多个浏览按钮/条目,所以我需要有多个按钮调用get_dir()并传递相应的条目字段。。。@Doktor J:传统的方法是为每个事件提供一个单独的处理程序,因此在您的情况下,为每个浏览按钮提供一个单独的get_dir()方法,或者您可以实现浏览按钮+条目小部件+。。作为一个复合小部件,让它自动完成你想要的所有事情,例如,获取一个路径过程,然后显示它等等。然后它就简单到创建你想要的多个复合小部件实例。可能重复@nbro我想你有你的重复向后,我在2010年问过这个问题,你在2011年问了一个问题,我之所以把这篇文章标记为另一篇文章的副本,是因为另一篇文章实际上包含了更多的信息,这个问题更简单。你能通过添加lambda部分来解释这是做什么的吗?我在Tkinter文档中的最小应用程序中遇到了这个问题,我想在按下按钮时向窗口添加文本。我让命令=label.grid()在它运行时添加一个标签,并添加lamba来修复它。为什么命令没有立即执行lambda?lambda关键字在做什么?这里也一样-我试过lambda,它也能用。它做了什么?
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)
xbBrowse = Button(frameN, text="Browse...", font=fontReg, command=lambda : self.get_dir(xbPath))