PyInstaller和pythondocx模块不能一起工作

2024-09-19 19:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力使我的程序可执行给我的FTC团队。一切正常,但当我尝试使用包含python docx的脚本时,它并没有完成全部工作。当我在PyCharm和终端上运行它时,它就起作用了。这是密码。我有Python。在

from tkinter import *
import sys,math,random,datetime,os,time
import tkinter.messagebox
from tkinter import filedialog
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showerror
from time import gmtime, strftime
from docx import Document
from docx.shared import Inches
import xlsxwriter

export = "Excel"
job = "No Job"
current_time = strftime("%m-%d-%Y", gmtime())
root = Tk()

TextArea = Text(width=60,height=17,pady=0)
task = Entry(width=90)
task.insert(10, "Task:")
e1 = Entry()
e1.insert(10, "First Name")
e2 = Entry()
e2.insert(10, "Last Name")
TextArea.insert(END, "Reflection:")
title = ["Titan Tech ", "Caleb Fahlgren made this!", "Python is life!", "FIRST Robotics!","This program is over 200 lines of code!"]
title = (random.choice(title))
root.title(title)
root.geometry("680x600")

#Submit Button
#This definition writes to the excel file
def Submit():
    submit = tkinter.messagebox.askquestion("Submit Entry", "Are you sure you want to submit?")
    if submit == "yes":
        current_time = strftime("%m-%d-%Y %H:%M", gmtime())
        fullname = "%s %s" % (e1.get(), e2.get())
        lastname = "%s" % (e2.get())
        task1 = "%s" % (task.get())
        alltext = TextArea.get("1.0",END)
        workbook = xlsxwriter.Workbook('Titan Tech ' + (strftime("%m-%d-%Y", gmtime())) + '.xlsx')
        worksheet = workbook.add_worksheet()
        format_text = workbook.add_format()
        format_text.set_text_wrap()
        cell_format = workbook.add_format({'align': 'center','valign': 'vcenter','border': 1,'text_wrap': 1})
        middle = workbook.add_format({'align':'center'})
        worksheet.merge_range('A5:G20', "", cell_format)
        worksheet.merge_range('A4:G4', "", cell_format)
        bold = workbook.add_format({'bold': 1})
        worksheet.write('A1', 'Name:',bold)
        worksheet.write('A4', task1)
        worksheet.write_string('B1',fullname, bold)
        worksheet.merge_range('A2:B2', "", cell_format)
        worksheet.merge_range('D2:E2', "", cell_format)
        worksheet.write_string('A2',"Student Initials")
        worksheet.write_string('C2',"_______",middle)
        worksheet.write_string('D2',"Mentor Initials")
        worksheet.write_string('F2',"_______",middle)
        worksheet.write('E1', 'Date:',bold)
        worksheet.write('F1',(strftime("%m-%d-%Y", gmtime())),bold)
        worksheet.write_rich_string('A5',alltext ,cell_format)
        userconfirm = tkinter.messagebox.showinfo("Save","Your entry has been saved to an " + export + " document!")
        workbook.close()

def Reset():
    python = sys.executable
    os.execl(python, python, * sys.argv)

def keypress(event):
    if event.keysym == 'Escape':
        root.destroy()

def Quit():
    quitask = tkinter.messagebox.askquestion("Quit", "Are you sure you want to quit?")
    if quitask == "yes":
        root.destroy()


firstname = Label(root, text="First Name",font=("Helvetica", 12),fg="green")
lastname = Label(root, text="Last Name",font=("Helvetica", 12),fg="green")
time = Label(root, text=current_time, font=("Helvetica", 12),fg="black")

ScrollBar = Scrollbar(root)
ScrollBar.config(command=TextArea.yview)
TextArea.config(yscrollcommand=ScrollBar.set)
ScrollBar.pack(side=RIGHT, fill=Y)


def cf():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 1")
def al():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 2")
def cm():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 3")
def np():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 4")
def cp():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 5")
def ns():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 6")
def ct():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 7")
def kt():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 8")
def mt():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 9")
def ek():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Sample")
    e2.insert(10, "Name 10")
def n():
    e1.delete(0, 'end')
    e2.delete(0, 'end')
    e1.insert(10, "Team")
    e2.insert(10, "Name")
def other():

    e1.delete(0, 'end')
    e2.delete(0, 'end')

def TextFile():
    current_time = strftime("%m-%d-%Y", gmtime())
    fullname = "%s %s" % (e1.get(), e2.get())
    lastname = "%s" % (e2.get())
    task1 = "%s" % (task.get())
    alltext = TextArea.get("1.0",END)
    textfile1 = tkinter.messagebox.askquestion("Text File", "Are you sure you want to export as a text file?")
    if textfile1 == "yes":
        textfile = open('Titan Tech' + (strftime("%m-%d-%Y", gmtime())) + '.txt',"w")
        textfile.write("Titan Tech  | Team # 10385   ")
        textfile.write("Name: " + fullname)
        textfile.write("        " + "Date: " + current_time)
        textfile.write('\n' + '\n' + task1)
        textfile.write('\n' + '\n' + alltext)
        textfile.close()
        tkinter.messagebox.showinfo("Save", "You have exported to text file successfully. It is in the location of this program.")

def helpmenusave():
    helpsaveconfirm = tkinter.messagebox.showinfo("Save", "This program exports the Excel, World, or text document to the location of this program!")

def userinterfacemenu():
    helpuserinterface = tkinter.messagebox.showinfo("User Interface", "The Users tab is where you can click on your name to autofill the name text boxes. The Export tab is where you choose to export to a specific format.")

def Open():
    textopen = tkinter.filedialog.askopenfile(mode='r', filetypes=[('Text Files', '*.txt'),('All Files', '*')])
    if textopen != None:
        txtopen = textopen.read()
        TextArea.delete(1.0,END)
        TextArea.insert(END,txtopen)
        tkinter.messagebox.showinfo("Open",  "Success!")
        try:
            txtopen.close()
        except AttributeError:
            print("Attribute Error")

menubar = Menu(root)
filemenu = Menu(menubar,tearoff = 0)
filemenu.add_command(label="New",command=Reset)
filemenu.add_command(label="Open",command=Open)
filemenu.add_command(label="Exit",command=Quit)
menubar.add_cascade(label="File",menu=filemenu)

#help menu
helpmenu = Menu(menubar,tearoff = 0)
helpmenu.add_command(label="None", command=n)
helpmenu.add_command(label="Sample Name 1", command=cf)
helpmenu.add_command(label="Sample Name 2", command=al)
helpmenu.add_command(label="Sample Name 3", command=cm)
helpmenu.add_command(label="Sample Name 4", command=np)
helpmenu.add_command(label="Sample Name 5",command=cp)
helpmenu.add_command(label="Sample Name 6",command=ns)
helpmenu.add_command(label="Sample Name 7",command=ct)
helpmenu.add_command(label="Sample Name 8",command=kt)
helpmenu.add_command(label="Sample Name 9",command=mt)
helpmenu.add_command(label="Sample Name 10", command=ek)
helpmenu.add_command(label="Other", command=other)
menubar.add_cascade(label="Users",menu=helpmenu)

这就是问题所在。它在Pycharm和terminal中都可以工作,但是当我用PyInstaller编译它时,它只执行wordsaveask=tkinter.messagebox.ask问题线下什么都没有。它应该创建Word文件,但没有。我也没有收到任何错误消息。在

^{pr2}$

Tags: samplenameaddtkinterdefdeletelabelcommand
2条回答

Pyinstaller不包括docx模块(我也有同样的问题,我会为其他人编写,因为我找不到合适的教程来解决它)

如果安装了Pyinstaller,请在cmd中使用:

pyi-makespec your_py_file_name.py

此命令创建.spec文件,但不继续生成可执行文件。在

在记事本中打开.spec文件并通过添加以下内容进行编辑:

^{pr2}$

以及

datas=[(path.join(site_packages,"docx","templates"), "docx/templates")],

我的示例.spec文件如下所示

# -*- mode: python -*-

import sys
from os import path
site_packages = next(p for p in sys.path if 'site-packages' in p)
block_cipher = None


a = Analysis(['xml_reader.py'],
             pathex=['C:\\Users\\Lenovo\\Desktop\\exe'],
             binaries=[],
             datas=[(path.join(site_packages,"docx","templates"), 
"docx/templates")],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='xml_reader',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='xml_reader')

使exe文件键入cmd

pyinstaller your_py_file_name.spec

它应该生成dist文件夹,其中是您的可执行文件

好的,首先让我们用Minimal Verifiable Example来做,好吗?在

from tkinter import *
import tkinter.messagebox

root = Tk()

def Word():
    wordsaveask = tkinter.messagebox.askquestion("Save", "do you want to save?")
    if wordsaveask == ("yes"):
        with open('Titan Tech.docx',"w") as f:
            f.write("TEST")
        tkinter.messagebox.showinfo('Saved', 'The file was made')
    else:
        tkinter.messagebox.showinfo("ok","did not save")

button = Button(root,text="test",command=Word)

button.pack()

mainloop()

这在终端中工作得很好,但奇怪的是,在打包到应用程序中后打开时,却无法获得成功保存的消息。在

您说过您不会收到任何错误消息,但是没有终端或ide raise TypeError对您来说是不可见的,所以让我们安排一些东西来重定向消息:

^{pr2}$

一旦我运行这个,我得到一个方便的小弹出窗口: mage of traceback, text is directly below

Traceback (most recent call last):
  File "/Users/Tadhg/Documents/codes/test.app/Contents/Resources/main.py", line 10, in Word
    with open('Titan Tech.docx',"w") as f:
PermissionError: [Errno 13] Permission denied: 'Titan Tech.docx'

现在是的,我正在使用mac,不,我没有使用PyInstaller(用纯python代码制作了我自己的appbuilder),但我仍然认为这是一个有效的答案,因为它将告诉您如何继续调试。如果你发布错误信息,我很乐意为你提供更多帮助。在

相关问题 更多 >