在python中提供多个文件名作为Tkinter GUI的链接,并使用默认应用程序打开

时间:2016-04-16 18:53:12

标签: python-2.7 tkinter

#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文件夹”中的每个文件的文件名显示为链接。但是在点击每个链接时,该文件夹的最后一个文件正在打开。有人可以更正代码,以便每个链接打开它自己的文件。我到处搜索,但没有发现这个话题。

2 个答案:

答案 0 :(得分:0)

这正是您目前编码的内容。您正在设置fileName全局,然后设置fileName = file,其中最后一个分配将是您循环中的最后一项。所以,这就是它打开最后一个文件的原因。如果您希望用户能够从这些中选择选项,我建议使用组合框或其他一些以文件名列表作为选项的小部件。然后,您可以绑定<<ComboboxSelected>>来呼叫您的makeLink功能。

您还应该重命名filefile是内置的。

答案 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)