如何使用tkfiledialog打开文件并使用记事本读取内容

时间:2017-11-08 09:53:15

标签: python tkinter

我想通过使用tk filedialog打开来阅读所选文件的内容。当我选择文件并单击打开按钮时,文件不会打开,而是关闭对话框。如何用记事本打开所选文件,以便我能够读取文件中的内容。

from tkinter import *
from tkinter import filedialog


def my_file():
    filename = filedialog.askopenfile(mode="r", initialdir="/", title="select file",
                                       filetypes=(("text files", "*.txt"), ("all files", "*.*")))



root = Tk()
root.geometry("300x300")
                              #open the selected txt file with notepad to read the content
b = Button(root, text="open text file", command = my_file).pack()

root.mainloop()

修改 通过@PM 2RING和@Erik的提示,我将filedialog.askopen文件更改为filedialog.askopenfilename,当我选择文件时将其返回到用notepad.exe打开。 这是代码:

from tkinter import *
from tkinter import filedialog
import os


def my_file():
    filename = filedialog.askopenfilename( initialdir="C:/", title="select 
file", filetypes=(("text files", "*.txt"), ("all files", "*.*")))
    for f in filename:
        return f
    os.system(r"C:/notepad.exe" + f)


root = Tk()
root.geometry("300x300")
                          #open the selected txt file with notepad to read 
the content
b = Button(root, text="open text file", command = my_file).pack()

root.mainloop()

输出此错误:

  

Blockquote'C:/ notepad.exet'未被识别为内部或外部命令,   可操作程序或批处理文件。   块引用

但当我更改了返回打印时,它将目录打印到终端。我试图用子进程打开

 subprocess.Popen([r'C:\Program Files (x86)\Notepad.exe' + f])

它也不会打开这个。

3 个答案:

答案 0 :(得分:2)

这里有一些事情需要修改。

首先,C:/notepad.exe不是记事本的位置(至少不在任何具有默认设置的Windows计算机上),您可以简单地使用notepad.exe,这样可以使其与系统更兼容将记事本移到另一个位置(需要引用)。

其次,执行。 。 。

for f in filename:
    return f
os.system(r"C:/notepad.exe" + f)

没有做你认为它做的事情。这里实际发生的是你的程序正在将字符串加载到循环中,评估第一个字符(可能" C")然后将字符串返回到Button窗口小部件。 #39; t收到任何返回的值。这会破坏你的功能,所以它实际上永远不会达到os.system(r"C:/notepad.exe" + f)的声明。

您还需要在用于打开记事本notepad.exe的语句和实际文件声明f之间包含空格,否则您将运行notepad.exeC:/text.txt之类的内容向你抛出错误。

你应该做的事情如下:

from tkinter import *
from tkinter import filedialog
import os

def my_file():
    filename = filedialog.askopenfilename( initialdir="C:/", title="select file", filetypes=(("text files", "*.txt"), ("all files", "*.*")))
    os.system(r"notepad.exe " + filename)

root = Tk()
root.geometry("300x300")
b = Button(root, text="open text file", command = my_file).pack()

root.mainloop()

我想补充一点,我不知道你为什么要这样做,为什么不简单地在Text小部件中显示文字?你在这里做的是为人们在记事本中添加一个额外的步骤,而不是打开文件浏览器,找到文件,然后打开它们,他们必须打开你的程序,然后打开文件浏览器,然后找到文件然后打开它。它至少添加了一次额外点击,更不用说程序的加载时间了。

答案 1 :(得分:1)

如PM 2Ring所述,我会使用os.system函数。正如其描述中提到的那样,“os.system(command)”让你执行命令就好像你已经在命令提示符下写了一样,所以os.system("Notepad c:/users/yourName/junk.txt)会打开一个名为junk.txt的文件,如果它在那个位置

换句话说,一旦您拥有filedialog.askopenfilename电话的文件名,请执行以下操作:

import os
os.system("Notepad " + filename) # where filename is the string that filedialog.askopenfilename returns

在您的代码中实现应该不会太糟糕,但如果您需要更完整的示例,请告诉我们。

答案 2 :(得分:0)

以下代码将显示按钮和文本小部件。该按钮将加载到您的文件中,文本小部件将显示它。我认为这是你的想法?

from tkinter import *
from tkinter import filedialog

def my_file():
    file = filedialog.askopenfile(mode="r", initialdir="/", title="select file",
                                   filetypes=(("text files", "*.txt"), ("all files", "*.*")))
    t.insert(END, file.read())
    file.close()

root = Tk()
root.geometry("300x300")
                          #open the selected txt file with notepad to read the content
t = Text(root)
t.grid(row=0, column=0)
b = Button(root, text="open text file", command = my_file)
b.grid(row=1, column=0)

root.mainloop()