如何使用 asksaveasfile 将文本从 Text-widget Tkinter 保存到 .doc?

2022-01-15 00:00:00 python tkinter tk dialog

问题描述

我想使用 asksaveasfilename 对话框将我在 Text 小部件中输入的一些内容保存为 .txt.doc 格式.在此之后,我希望它分别打开.记事本或 MS Word.

I want to save some stuff I entered in a Text widget to a .txt or .doc format, using an asksaveasfilename dialog box. After this I want it to open in resp. Notepad or MS Word.

from tkFileDialog import asksaveasfilename
import os.path

name = asksaveasfilename(
           initialdir="dir",
           title="Save as",
           filetypes=[("Text files",".txt"),("Word files",".doc")])

data = open(name,"w")
data.write("text from text widget")

os.startfile(name)

它会创建文件,但不会在 MS Word 或记事本中打开它.相反,它询问我想如何打开这个文件.如果我选择程序,它将正确打开,但我希望它直接打开.(不选择打开文件的程序).当我直接在文件名:"框中提供扩展名时,它会按照我想要的方式工作.

It creates the file but it won't open it in MS Word or Notepad. Instead it asks how I want to open this file. If I choose the programm it will open correctly, but I want it to open directly. (without choosing a program to open the file with). When I give the extension directly in the "File name:" box it works the way I want though.

这有效:文件名:something.doc保存类型:Word 文件 (*.doc)---> 创建 something.doc 并在 MS Word 中打开它.

This works: File name: something.doc Save as type: Word file (*.doc) ---> creates something.doc and opens it in MS Word.

但这并不文件名称:某事保存类型:Word 文件 (*.doc)---> 创建一些东西(没有扩展名)并询问我希望它在什么程序中打开.

But this doesn't File name: something Save as type: Word file (*.doc) ---> creates something (no extension) and ask in what program I want it to open.

我使用 Python 2.7.8、Windows 8、Office 2010.

I use Python 2.7.8, Windows 8, Office 2010.


解决方案

加上print name就可以看到问题,例如

You can see the problem if you add print name, e.g.

C:/Users/jsharpe/Downloads/testing

请注意,没有添加任何扩展 - 我只输入了 "testing".filetypes 参数对于限制用户选择现有文件更有用,如果用户不提供扩展名,它将不会添加适当的扩展名.

note that no extension has been added - I only entered "testing". The filetypes argument is more useful for limiting the user's selection of existing files, it won't add the appropriate extension if the user doesn't supply one.

您可以为用户不输入扩展名的情况设置 defaultextension,但这不会反映在下拉列表中选择的类型(例如,如果您设置了 defaultextension=".txt" 即使用户从 filetypes 中选择该选项,它也不会是 .doc).

You can set a defaultextension for the cases where the user doesn't enter an extension, but this won't reflect the type selected in the drop-down (e.g. if you set defaultextension=".txt" it won't be .doc even if the user chooses that option from filetypes).

name = asksaveasfilename(defaultextension=".txt",
                         filetypes=[("Text files",".txt"),
                                    ("Word files",".doc")],
                         initialdir="dir",
                         title="Save as")

(请注意,随着您添加越来越多的选项,按字母顺序排列的参数顺序会让生活变得更轻松)

附带说明,您(仍然!)不要 close 文件,这可能会导致问题 - 我建议对文件使用 with 上下文管理器处理:

On a side note, you (still!) don't close the file, which could cause issues - I'd suggest using the with context manager for file handling:

with open(name, "w") as data:
    data.write("text from text widget")

相关文章