如何使用asksaveasfile将Tkinter的Text组件内容保存为.doc文件?

0 投票
2 回答
3089 浏览
提问于 2025-04-28 10:26

我想把我在一个文本框里输入的一些内容保存为 .txt.doc 格式,使用一个叫做 asksaveasfilename 的对话框。之后我希望它能直接在记事本或微软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)

虽然它能创建文件,但却不能直接在微软Word或记事本中打开。相反,它会问我想用什么程序来打开这个文件。如果我选择了程序,它会正常打开,但我希望它能直接打开(不需要选择打开文件的程序)。不过,如果我在“文件名:”框里直接输入扩展名,它就能按我想要的方式工作。

这样做是可以的: 文件名: something.doc 保存类型: Word文件 (*.doc) ---> 创建了 something.doc,并在微软Word中打开。

但这样做就不行: 文件名: something 保存类型: Word文件 (*.doc) ---> 创建了 something(没有扩展名),然后问我想用哪个程序来打开。

我使用的是 Python 2.7.8,Windows 8,Office 2010。

暂无标签

2 个回答

0

只需运行这段代码,它就会正常工作:

from tkinter import *
from tkinter import ttk
name=[]*1000
surname=[]*1000
email=[]*1000
password=[]*1000
cpassword=[]*1000
phonenum=[]*1000
def mainpage3():
    global phonenum
    global cpassword
    global password
    global email
    global surname
    global name
    global page1
    global bpage
    global e1
    global e2
    global e3
    global e4
    global e5
    global e6 
    name.append(e1.get())
    surname.append(e2.get())
    email.append(e3.get())
    password.append(e4.get())
    cpassword.append(e5.get())
    phonenum.append(e6.get())
    bpage.destroy()
    cpage=Tk()
    cpage.title('boors')
    mainframe = ttk.Frame(cpage, padding="3 3 12 12")
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
    mainframe.columnconfigure(0, weight=1)
    mainframe.rowconfigure(0, weight=1)
    ttk.Label(cpage,text='نام').grid(column=8,row=1)
    ttk.Label(cpage,text='نام خانوادگي').grid(column=8,row=2)
    ttk.Label(cpage,text='ايميل').grid(column=8,row=3)
    ttk.Label(cpage,text='شماره تلفن').grid(column=8,row=4)
    ttk.Label(cpage,text=name[0]).grid(column=7,row=1)
    ttk.Label(cpage,text=surname[0]).grid(column=7,row=2)
    ttk.Label(cpage,text=email[0]).grid(column=7,row=3)
    ttk.Label(cpage,text=phonenum[0]).grid(column=7,row=4)
    ttk.Label(cpage,text='').grid(column=8,row=5)
    ttk.Button(cpage,text='خريد').grid(column=8,row=6)
    ttk.Button(cpage,text='فروش').grid(column=8,row=7)
    ttk.Entry(cpage).grid(column=7,row=6)
    ttk.Entry(cpage).grid(column=7,row=7)
    ttk.Label(cpage,text='agah').grid(column=1,row=1)
    ttk.Label(cpage,text='agah').grid(column=2,row=1)
    ttk.Label(cpage,text='agah').grid(column=3,row=1)
    ttk.Label(cpage,text='agah').grid(column=4,row=1)
    ttk.Label(cpage,text='code').grid(column=5,row=1)
    ttk.Label(cpage,text='agah').grid(column=1,row=2)
    ttk.Label(cpage,text='agah').grid(column=2,row=2)
    ttk.Label(cpage,text='agah').grid(column=3,row=2)
    ttk.Label(cpage,text='agah').grid(column=4,row=2)
    ttk.Label(cpage,text='1').grid(column=5,row=2)
    ttk.Label(cpage,text='agah').grid(column=1,row=3)
    ttk.Label(cpage,text='agah').grid(column=2,row=3)
    ttk.Label(cpage,text='agah').grid(column=3,row=3)
    ttk.Label(cpage,text='agah').grid(column=4,row=3)
    ttk.Label(cpage,text='2').grid(column=5,row=3)
    ttk.Label(cpage,text='agah').grid(column=1,row=4)
    ttk.Label(cpage,text='agah').grid(column=2,row=4)
    ttk.Label(cpage,text='agah').grid(column=3,row=4)
    ttk.Label(cpage,text='agah').grid(column=4,row=4)
    ttk.Label(cpage,text='3').grid(column=5,row=4)
    ttk.Label(cpage,text='agah').grid(column=1,row=5)
    ttk.Label(cpage,text='agah').grid(column=2,row=5)
    ttk.Label(cpage,text='agah').grid(column=3,row=5)
    ttk.Label(cpage,text='agah').grid(column=4,row=5)
    ttk.Label(cpage,text='4').grid(column=5,row=5)
    ttk.Label(cpage,text='اخبار').grid(column=3,row=6)
    ttk.Label(cpage,text=' بگو آگاه اخبار').grid(column=3,row=7)
    ttk.Label(cpage,text='     ').grid(column=2,row=6)
def mainpage2():
    global e1
    global e2
    global e3
    global e4
    global e5
    global e6
    global bpage
    page1.destroy()
    bpage=Tk()
    bpage.title('boors')
    bpage.geometry('1000x1000')

    mainframe = ttk.Frame(bpage, padding="3 3 12 12")
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
    mainframe.columnconfigure(0, weight=1)
    mainframe.rowconfigure(0, weight=1)
    ttk.Label(bpage,text='').grid(column=1,row=1,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=3,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=4,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=6,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=7,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=9,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=10,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=12,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=13,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=15,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=16,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=18,sticky=E)
    ttk.Label(bpage,text='').grid(column=1,row=19,sticky=E)
    ttk.Label(bpage,text='Name',font='Verdana 25 bold').grid(column=1,row=2,sticky=E)
    e1=ttk.Entry(bpage,width=100)
    e1.grid(column=2,row=2,sticky=E)
    ttk.Label(bpage,text='Surname',font='Verdana 25 bold').grid(column=1,row=5,sticky=E)
    e2=ttk.Entry(bpage,width=100)
    e2.grid(column=2,row=5,sticky=E)
    ttk.Label(bpage,text='Email',font='Verdana 25 bold').grid(column=1,row=8,sticky=E)
    e3=ttk.Entry(bpage,width=100)
    e3.grid(column=2,row=8,sticky=E)
    ttk.Label(bpage,text='Password',font='Verdana 25 bold').grid(column=1,row=11,sticky=E)
    e4=ttk.Entry(bpage,width=100)
    e4.grid(column=2,row=11,sticky=E)
    ttk.Label(bpage,text='confirm password',font='Verdana 25 bold').grid(column=1,row=14,sticky=E)
    e5=ttk.Entry(bpage,width=100)
    e5.grid(column=2,row=14,sticky=E)
    ttk.Label(bpage,text='phone number',font='Verdana 25 bold').grid(column=1,row=17,sticky=E)
    e6=ttk.Entry(bpage,width=100)
    e6.grid(column=2,row=17,sticky=E)    
    ttk.Button(bpage,text='done',width=100,command=mainpage3).grid(column=2,row=20,sticky=E)

def mainpage():
    global page1
    page1=Tk()
    page1.title('bours')
    mainframe = ttk.Frame(page1, padding="3 3 12 12")
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
    mainframe.columnconfigure(0, weight=1)
    mainframe.rowconfigure(0, weight=1)
    ttk.Label(page1,text='Register Here',font = "Verdana 80 bold").grid(column=1,row=2)
    ttk.Label(page1,text='',font='Verdana 30 bold').grid(column=1,row=1,sticky=E)
    ttk.Button(page1,text='register',width=170,command=mainpage2).grid(column=1,row=4,sticky=E)
    ttk.Label(page1,text='',font='Verdana 30 bold').grid(column=1,row=3,sticky=E)
mainpage()
0

如果你加上 print name,就能看到问题所在,比如:

C:/Users/jsharpe/Downloads/testing

注意,这里没有添加任何扩展名 - 我只输入了 "testing"filetypes 这个参数更适合用来限制用户选择已有文件的类型,如果用户没有提供扩展名,它是不会自动添加合适的扩展名的。

你可以为用户没有输入扩展名的情况设置一个 defaultextension,但是这不会反映在下拉菜单中选择的类型(例如,如果你设置 defaultextension=".txt",即使用户从 filetypes 中选择了 .doc,它也不会变成 .doc)。

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

(顺便提一下,按字母顺序排列参数会让你在添加更多选项时更轻松)


另外,你(仍然!)没有 close 文件,这可能会导致一些问题 - 我建议使用 with 上下文管理器来处理文件:

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

撰写回答