所以这是我的问题,我无法弄清楚,似乎无法找到信息来帮助我了解正在发生的事情。所以我将source
设置为调用名为openDirectory
的函数的按钮,这实际上只是在os.path.join()
上调用os.path.normalize()
和askopendirectory
的捷径来自tkinter.filedialog
的功能。
问题是source
始终是一个数字,我无法弄清楚为什么它不是我在openDirectory
函数中选择的路径。我也尝试将代码直接放在openDirectory
里面的按钮命令中,它仍然会做同样的事情。
重现的步骤:
messagebox
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 :(得分: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>