如何将变量设置为tkinter按钮的命令功能结果?

时间:2016-09-16 22:38:44

标签: python python-3.x button tkinter

所以这是我的问题,我无法弄清楚,似乎无法找到信息来帮助我了解正在发生的事情。所以我将source设置为调用名为openDirectory的函数的按钮,这实际上只是在os.path.join()上调用os.path.normalize()askopendirectory的捷径来自tkinter.filedialog的功能。

问题是source始终是一个数字,我无法弄清楚为什么它不是我在openDirectory函数中选择的路径。我也尝试将代码直接放在openDirectory里面的按钮命令中,它仍然会做同样的事情。

重现的步骤:

  1. 运行此代码(使用python 3.5编写)
  2. 使用源按钮选择路径
  3. 点击右下角的按钮,该按钮应显示messagebox
  4. 中的路径
  5. 请注意,messagebox显示的是一个较大的数字,而不是路径。
  6. 如何获取存储在源变量中的路径,以便我可以随时访问它?

    #!/usr/bin/python
    import os
    from functions import *
    from tkinter import *
    from tkinter import messagebox
    from tkinter import filedialog
    
    
    class FileMover(Frame):
        def __init__(self, parent):
            Frame.__init__(self, parent)
            self.parent = parent
            self.initUI()
    
        def openDirectory(listfiles, recursive):
            destination = os.path.join(os.path.normpath(filedialog.askdirectory()), "")
            return destination
    
        def initUI(self):
            self.parent.title("File Mover")
            self.pack()
    
            recursiveCheck = bool
            previewCheck = bool
    
            # source button and label. source should equal the path selected in openDirecotry
            source = Button(self, text="Source Directory", command=lambda:openDirectory(recursiveCheck))
            sourceLabel = Label(self, text="Select a Source Directory...")
            sourcemsg = Button(self, text="Source Variable", command=lambda:messagebox.askokcancel(self, source))
    
            # check box used to tell open directory either true or false to recurse the source dir
            recursiveLabel = Label(self, text="Recursive ")
            recursive = Checkbutton(self, onvalue=True, offvalue=False, variable=recursiveCheck)
    
            # destination button and label. source should equal the path selected in openDirecotry
            destination = Button(self, text="Target Directory ", command=lambda:openDirectory(False))
            destinationLabel = Label(self, text="Select a Target Directory...")
    
            # not implemented yet
            previewLabel = Label(self, text="Preview ")
            preview = Checkbutton(self, onvalue=True, offvalue=False, variable=previewCheck)
    
            source.grid(row=0, column=0, columnspan=2)
            sourceLabel.grid(row=0, column=2)
            recursiveLabel.grid(row=1, column=1)
            recursive.grid(row=1, column=2, sticky=W)
            destination.grid(row=2, column=0, columnspan=2)
            destinationLabel.grid(row=2, column=2)
            previewLabel.grid(row=4, column=6)
            preview.grid(row=4, column=7, sticky=W)
            # just for debugging to show source directory on demand
            sourcemsg.grid(row=5, column=8)
    
    def main():
        root = Tk()
        ex = FileMover(root)
        root.mainloop()
    
    if __name__ == '__main__':
        main()
    

1 个答案:

答案 0 :(得分:1)

按钮不起作用。当一个函数用作按钮的回调并且使用该按钮调用该函数时,无处可回。没有一种明智的方法来完成这项工作。如果它按照你猜测它的方式工作,你就会失去对按钮的引用!你不希望这样。

相反,只需将其保存为实例变量:

def openDirectory(self, recursive):
    self.destination = os.path.join(os.path.normpath(filedialog.askdirectory()), "")

请注意,您的openDirectory方法有listfiles引用实例本身,而其他方法使用传统的self - 我已将其更改为使用self所以您无需处理listfiles.destination = ...

sourcemsg = Button(self, text="Source Variable", command=lambda:messagebox.askokcancel('Window Title', self.destination))

请注意,我已将messagebox.askokcancel的参数更改为字符串'Window Title'和参考self.destination,因此窗口的标题不是对框架的引用(它应该是是一个窗口标题的字符串)它是一个实际的字符串,而不是消息的文本是对按钮的引用(它应该是消息文本的字符串),它是您在openDirectory中保存的字符串。 / p>