2016-09-16 53 views
0

所以这里是我的问题,我只是无法弄清楚,似乎无法找到信息来帮助我理解正在发生的事情。所以我设置了source等于调用openDirectory这个函数的按钮,这个函数实际上只是一个快捷方式,在tkinter.filedialogaskopendirectory函数上调用os.path.join()os.path.normalize()如何将一个变量设置为tkinter Button的命令函数的结果?

问题是source始终是一个数字,我不明白为什么它不是我在openDirectory函数中选择的路径。我也尝试将openDirectory中的代码直接放在按钮的命令中,它仍然执行相同的操作。

重现步骤:

  1. 运行这段代码(使用Python 3.5编写)
  2. 使用源按钮
  3. 在右下角点击该按钮应显示在路径选择路径a messagebox
  4. 请注意,messagebox显示的是一个大数字而不是路径。

如何获取存储在源变量中的路径,以便随时访问它?

#!/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() 
+0

可能需要帮助: http://stackoverflow.com/questions/11295917/how-to-select-a-directory-and-store-the-location-using-tkinter-in-python – wbrugato

回答

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中的字符串。

+0

你摇滚!我从来没有这样想过,但基于你给出的解释,它是非常有意义的。非常感谢! – balfred

相关问题