#python version 2.7.11
import os
from Tkinter import *
fileName = "Nothing" #fileName is required so that the callback function can link the current file name with button click
def callback(event):
#os.startfile() works only on windows machine
os.startfile(fileName) #opens the fileName with its default application (in my case a pdf viewer)
def makeLink(file):
global fileName
fileName = file
link = Label(textbox, text=fileName, fg="blue", cursor="hand2")
link.pack()
link.bind("<Button-1>", callback)
oldDir = os.getcwd()
newDir = os.chdir("pdf folder") #pdf folder contains some pdf files
root = Tk()
textbox = Text(root)
textbox.pack()
allFiles = os.listdir(os.getcwd()) #makes a list of files present in current directory
for file in allFiles:
makeLink(file)
root.mainloop()
os.chdir(oldDir)
我想选择包含一些pdf文件的文件夹文件(在上面的代码中是pdf文件夹),并在GUI窗口中将它们显示为链接。当在链接上按下时,文件应该使用它的默认应用程序打开(因此pdf文件应该使用默认的pdf查看器打开)。我的代码将“pdf文件夹”中的每个文件的文件名显示为链接。但是在点击每个链接时,该文件夹的最后一个文件正在打开。有人可以更正代码,以便每个链接打开它自己的文件。我到处搜索,但没有发现这个话题。
答案 0 :(得分:0)
这正是您目前编码的内容。您正在设置fileName
全局,然后设置fileName = file
,其中最后一个分配将是您循环中的最后一项。所以,这就是它打开最后一个文件的原因。如果您希望用户能够从这些中选择选项,我建议使用组合框或其他一些以文件名列表作为选项的小部件。然后,您可以绑定<<ComboboxSelected>>
来呼叫您的makeLink
功能。
您还应该重命名file
。 file
是内置的。
答案 1 :(得分:0)
这个问题肯定可以通过组合框完成,但是当我有很多pdf文件时,每个文件都放在一个组合框中,这不是一个很好的交互方式。 这里我有两个计数变量 - 一个是全局计数,一个是localCount。 localCount需要记住要打开哪个文件的计数。
from Tkinter import *
import os
def callback(count):
os.system("open "+fileNames[count])
def makeLink(files):
localCount = count
link = Button(frame1, text=(count , files), bg="light blue", cursor="hand2", command=lambda: callback(localCount))
link.pack()
oldDir = os.getcwd()
newDir = os.chdir("pdf folder")
fileNames = os.listdir(os.getcwd())
root = Tk()
frame1 = Frame(root)
frame1.pack()
count = 0
for files in fileNames:
makeLink(files)
count += 1
root.mainloop()
os.chdir(oldDir)