Pyinstaller EXE只能从CMD运行,单击EXE无效

如何解决Pyinstaller EXE只能从CMD运行,单击EXE无效

我为我的一个朋友制作了一个简单的python程序,该程序使用了tkinterSMTPlib。 我使用pyinstaller为该程序制作了一个.exe,但是当我双击.exe时,我的CMD终端将在屏幕上闪烁一秒钟,然后消失。当我将相同的.exe拖到CMD终端上并按Enter键时,程序运行没有问题,程序的所有功能均正常工作。

我要附加pyinstaller创建的.spec文件,但我根本没有修改它。我真的觉得它应该工作,因为如果我从CMD调用它,它100%可以工作,那么只有在双击.exe时才有问题。极其沮丧。

我已经多次在网上看到同样的问题,并且没有找到对我有帮助的解决方案。任何帮助将不胜感激。

编辑:按照以下建议,我能够运行该程序。我必须更改.spec文件,特别是datas字段才能使其正常工作。但是,我现在在加载.txt文件时遇到问题,但是在编辑它们时,编辑内容并未按原样保存。当我只能从CMD运行程序时,在我修复原始问题之前,所有编辑都已保存。我在下面发布了整个脚本:

编辑II:我没有将文件置于“ w”模式,这就是为什么我没有将任何输出输出到文本文件的原因。现在一切正常!

我的规格文件

block_cipher = None


a = Analysis(['test.py'],pathex=['C:\\Users\\wiley\\PycharmProjects\\EmailBot\\email_bot2'],binaries=[],datas=[('students1.txt','.'),('students2.txt','.')],hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure,a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,[],exclude_binaries=True,name='test',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=False )
coll = COLLECT(exe,a.binaries,a.zipfiles,a.datas,upx_exclude=[],name='test')

我的main.py文件

from tkinter import *
from tkinter import ttk
import re
import email_data
import smtplib
import os

__location__ = os.path.realpath(os.path.join(os.getcwd(),os.path.dirname(__file__)))

student_view = None
email_string = ''


def display_email():
    def save_and_close():
        preview_window.destroy()

    preview_window = Toplevel()
    preview_window.title("Preview")
    preview_window.geometry('-680+300')
    preview_window.grab_set()
    preview_window.lift(root)

    preview_frame = ttk.Frame(preview_window,padding=10)
    preview = Text(preview_frame)
    close_button = Button(preview_frame,text='Close',command=save_and_close)

    preview_frame.grid()
    preview.grid(column=0,row=0,sticky='NSEW')
    close_button.grid(column=0,row=1,sticky='NSEW')

    preview.insert(END,email_string)


def format_email():
    global email_string
    email_string = email_data.email_string_raw.format(this_lab_name=t1.get(),zoom_date_time=t2.get(),zoom_link=t3.get(),zoom_ID=t4.get(),zoom_passcode=t5.get(),this_lab_supplemental=t6.get(),this_lab_consisting=t7.get(),this_lab_due=t8.get(),file_name_tag=t9.get(),last_lab_reminder=t10.get(),last_lab_due=t11.get(),last_lab_supplemental=t12.get(),last_file_name_tag=t13.get())
    view_email_button['state'] = 'normal'
    send_button['state'] = 'normal'


def send_email():
    global p,z,email_string,emails1,emails2

    def send_email_final():
        smtp_obj = smtplib.SMTP('smtp.office365.com',port=587)
        smtp_obj.starttls()
        email = email_input.get()
        password = email_pass_input.get()
        smtp_obj.login(email,password)

        from_address = email_input.get()

        msg = "Subject: CHML101: Weekly Instructional Email" + '\n\n' + email_string
        to_address_list = []
        if p.get() == 1:
            data = open(os.path.join(__location__,'students1.txt'))
            emails = data.read()
            to_address_list = emails.split('\n')
            print(to_address_list.__str__())
        elif p.get() == 2:
            data = open(os.path.join(__location__,'students2.txt'))
            emails = data.read()
            to_address_list = emails.split('\n')
            print(to_address_list.__str__())

        print(msg)
        smtp_obj.sendmail(from_address,to_address_list,msg)

    def confirm_normal():
        confirm_check['state'] = 'normal'

    def send_normal():
        if z.get() == 1:
            send_email_button['state'] = 'normal'
        else:
            send_email_button['state'] = 'disabled'

    send_email_window = Toplevel()
    send_email_window.title("Send Email")
    send_email_window.geometry('400x175-680+300')
    send_email_window.grab_set()
    send_email_window.lift(root)

    send_frame = ttk.Frame(send_email_window)
    email_label = Label(send_frame,text='Enter your email address:')
    pass_label = Label(send_frame,text='Enter your email password:')
    email_input = Entry(send_frame)
    email_pass_input = Entry(send_frame,show='*')
    class_label1 = Label(send_frame,text='Email class 1:')
    class_label2 = Label(send_frame,text='Email class 2:')
    class_radio1 = Radiobutton(send_frame,var=p,value=1,command=confirm_normal)
    class_radio2 = Radiobutton(send_frame,value=2,command=confirm_normal)
    confirm_label = Label(send_frame,text='Confirm selection:')
    confirm_check = Checkbutton(send_frame,state='disabled',variable=z,command=send_normal)
    send_email_button = Button(send_frame,text='Send Email',command=send_email_final)

    send_frame.grid(column=0,sticky='NSEW')
    email_label.grid(column=0,columnspan=2)
    pass_label.grid(column=2,columnspan=2)
    email_input.grid(column=0,columnspan=2)
    email_pass_input.grid(column=2,columnspan=2)
    class_label1.grid(column=0,row=2)
    class_label2.grid(column=2,row=2)
    class_radio1.grid(column=1,row=2)
    class_radio2.grid(column=3,row=2)
    confirm_label.grid(column=1,row=3)
    confirm_check.grid(column=2,row=3)
    send_email_button.grid(columnspan=2,column=1,row=4)


def class_list_view():
    global emails1,emails2,v,student_view

    def update_txt():
        items = student_view.get(0,'end')
        if v.get() == 2:
            data1 = open(os.path.join(__location__,'students2.txt'),mode='w')
            first = True
            for item in items:
                if first:
                    data1.write(item)
                    first = False
                else:
                    data1.write('\n' + item)
            data1.close()
        if v.get() == 1:
            data1 = open(os.path.join(__location__,'students1.txt'),mode='w')
            first = True
            for item in items:
                if first:
                    data1.write(item)
                    first = False
                else:
                    data1.write('\n' + item)
            data1.close()

    def check_email():
        email = add_student_entry.get()
        if re.match(r'\w+@\w+.\w+',email) is not None:
            add_student()
            add_student_label['text'] = 'Add new student Email:'
            update_txt()
        else:
            add_student_label['text'] = 'EMAIL FORMAT INVALID'

    def delete_student():
        student_view.delete('active')
        update_txt()

    def add_student():
        if v.get() == 2:
            emails2_curr = emails2.get()
            emails2_curr = list(emails2_curr)
            emails2_curr.append(add_student_entry.get())
            emails2.set(emails2_curr)
            add_student_entry.delete(0,'end')
        if v.get() == 1:
            emails1_curr = emails1.get()
            emails1_curr = list(emails1_curr)
            emails1_curr.append(add_student_entry.get())
            emails1.set(emails1_curr)
            add_student_entry.delete(0,'end')

    def assign_class():
        if v.get() == 2:
            student_view['listvariable'] = emails2
        elif v.get() == 1:
            student_view['listvariable'] = emails1

    class_list = Toplevel()
    class_list.title("View/Edit Class Lists")
    class_list.geometry('400x200-680+300')
    class_list.grab_set()
    class_list.lift(root)

    student_frame = ttk.Frame(class_list)
    student_view = ListBox(student_frame,height=10,width=30)
    class1 = Radiobutton(student_frame,text='Class 1',var=v,command=assign_class)
    class2 = Radiobutton(student_frame,text='Class 2',command=assign_class)
    add_student_label = Label(student_frame,text='Add new student Email:')
    add_student_entry = Entry(student_frame,width=30)
    add_student_button = Button(student_frame,text='Add',command=check_email)
    delete_student_button = Button(student_frame,text='Delete',command=delete_student)

    add_student_entry.grid(column=2,sticky=N)
    add_student_label.grid(column=2,sticky=(N,E,W))
    add_student_button.grid(column=2,row=2)
    delete_student_button.grid(column=2,row=3)
    student_frame.grid(column=0,S,W))
    student_view.grid(column=3,columnspan=3,rowspan=8,W,E))
    class1.grid(column=3,row=8)
    class2.grid(column=4,row=8)


root = Tk()
root.title("Dr. Emailio Robotus")
root.geometry('600x700-670+120')
root.minsize(400,500)

v = Intvar()
p = Intvar()
z = Intvar()

t1 = StringVar()
t2 = StringVar()
t3 = StringVar()
t4 = StringVar()
t5 = StringVar()
t6 = StringVar()
t7 = StringVar()
t8 = StringVar()
t9 = StringVar()
t10 = StringVar()
t11 = StringVar()
t12 = StringVar()
t13 = StringVar()

# data = open('students1.txt',encoding='utf-8')
data = open(os.path.join(__location__,'students1.txt'))
emails = data.read()
emails1 = emails.split('\n')
emails1 = Variable(value=emails1)
data.close()

data = open(os.path.join(__location__,'students2.txt'))
emails = data.read()
emails2 = emails.split('\n')
emails2 = Variable(value=emails2)
data.close()

mainframe = ttk.Frame(root,padding="5",borderwidth=5,relief='solid')

this_lab_name = ttk.Entry(mainframe,width=50,background='grey',textvariable=t1)
this_lab_name_label = Label(mainframe,text='This week\'s lab name:')

zoom_date_time = ttk.Entry(mainframe,textvariable=t2)
zoom_date_time_label = Label(mainframe,text='This week\'s Zoom meeting (date/time):')

zoom_link = ttk.Entry(mainframe,textvariable=t3)
zoom_link_label = Label(mainframe,text='This week\'s Zoom link:')

zoom_ID = ttk.Entry(mainframe,textvariable=t4)
zoom_ID_label = Label(mainframe,text='This week\'s Zoom meeting ID:')

zoom_passcode = ttk.Entry(mainframe,textvariable=t5)
zoom_passcode_label = Label(mainframe,text='This week\'s Zoom meeting passcode:')

this_lab_supplemental = ttk.Entry(mainframe,textvariable=t6)
this_lab_supplemental_label = Label(mainframe,text='This week\'s lab\'s supplemental questions:')

this_lab_consisting = ttk.Entry(mainframe,textvariable=t7)
this_lab_consisting_label = Label(mainframe,text='This week\'s lab should be consisting of:')

this_lab_due = ttk.Entry(mainframe,textvariable=t8)
this_lab_due_label = Label(mainframe,text='This week\'s lab is due (date/time):')

file_name_tag = ttk.Entry(mainframe,textvariable=t9)
file_name_tag_label = Label(mainframe,text='This week\'s lab naming format (Aspirin/Hess):')

last_lab_reminder = ttk.Entry(mainframe,textvariable=t10)
last_lab_reminder_label = Label(mainframe,text='Last week\'s lab name:')

last_lab_due = ttk.Entry(mainframe,textvariable=t11)
last_lab_due_label = Label(mainframe,text='Last week\'s lab is due (date/time):')

last_lab_supplemental = ttk.Entry(mainframe,textvariable=t12)
last_lab_supplemental_label = Label(mainframe,text='Last week\'s lab\'s supplemental questions:')

last_file_name_tag = ttk.Entry(mainframe,textvariable=t13)
last_file_name_tag_label = Label(mainframe,text='Last week\'s lab naming format (Aspirin/Hess):')

compile_button = Button(mainframe,text='Compile Email',command=format_email,width=25)
view_email_button = Button(mainframe,text='View Email',command=display_email,width=25)

classes_button = Button(mainframe,text='View/Modify Class List',command=class_list_view,width=18)

send_button = Button(mainframe,text='Send Email...',width=18,command=send_email)

mainframe.grid(column=0,W))

this_lab_name.grid(column=1,sticky=E,padx=3,pady=3)
this_lab_name_label.grid(column=0,sticky=W,pady=3)

zoom_date_time.grid(column=1,pady=3)
zoom_date_time_label.grid(column=0,pady=3)

zoom_link.grid(column=1,row=2,pady=3)
zoom_link_label.grid(column=0,pady=3)

zoom_ID.grid(column=1,row=3,pady=3)
zoom_ID_label.grid(column=0,pady=3)

zoom_passcode.grid(column=1,row=4,pady=3)
zoom_passcode_label.grid(column=0,pady=3)

this_lab_supplemental.grid(column=1,row=5,pady=3)
this_lab_supplemental_label.grid(column=0,pady=3)

this_lab_consisting.grid(column=1,row=6,pady=3)
this_lab_consisting_label.grid(column=0,pady=3)

this_lab_due.grid(column=1,row=7,pady=3)
this_lab_due_label.grid(column=0,pady=3)

file_name_tag.grid(column=1,row=8,pady=3)
file_name_tag_label.grid(column=0,pady=3)

last_lab_reminder.grid(column=1,row=9,pady=3)
last_lab_reminder_label.grid(column=0,pady=3)

last_lab_due.grid(column=1,row=10,pady=3)
last_lab_due_label.grid(column=0,pady=3)

last_lab_supplemental.grid(column=1,row=11,pady=3)
last_lab_supplemental_label.grid(column=0,pady=3)

last_file_name_tag.grid(column=1,row=12,pady=3)
last_file_name_tag_label.grid(column=0,pady=3)

compile_button.grid(column=0,row=13,columnspan=2,pady=3)
view_email_button.grid(column=0,row=14,pady=3)
classes_button.grid(row=15,column=0,pady=3)
send_button.grid(row=16,pady=3)

root.columnconfigure(0,weight=1)
root.rowconfigure(0,weight=1)
# mainframe.rowconfigure(0,weight=1)
# mainframe.columnconfigure(0,weight=1)


if __name__ == '__main__':
    root.mainloop()

解决方法

尝试下面的spec文件。我刚刚将属性console=True更改为console=False,请注意,现在您需要运行pyinstaller main.spec而不是pyinstaller main.py

如果您不想使用此规范文件,而只想从脚本中执行,则在运行--noconsole时在命令中添加--windowedpyinstaller main.py

例如pyinstaller main.py --noconsole

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['__main__.py'],pathex=['C:\\Users\\wiley\\PycharmProjects\\EmailBot\\email_bot'],binaries=[],datas=[],hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure,a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,[],exclude_binaries=True,name='__main__',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=False)
coll = COLLECT(exe,a.binaries,a.zipfiles,a.datas,upx_exclude=[],name='__main__')
,

按照给出的建议,我能够使程序运行。为了使它能正常工作,我不得不更改.spec文件,特别是datas字段。

但是,那时我遇到了一个问题,.txt文件将被加载到程序中,但是在编辑它们时,所做的编辑未按原样保存。解决方案:我没有将文件置于“ w”模式,这就是为什么我没有将任何输出输出到文本文件的原因。现在一切正常!谢谢大家的帮助。我已经更新了上面的文件以反映最终的工作版本

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?