@holllop

Как ускорить запуск .exe файла?

Я написал приложение на Питоне 3.4.4, и на библиотеки Tkinter не спешите в меня кидать помидорами, такое решение обусловлено тем, что это приложение будет использовать на разных машинах, а на некоторых из них стоят древние Windows, например XP.
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
import socket
import os
from datetime import datetime
import json


# Функция для отправки данных на сервер через WebSocket
def send_data_to_server(data):
    import websocket
    try:
        ws = websocket.create_connection("ws://server:3000")
        ws.send(json.dumps(data))
        ws.close()
    except Exception as e:
        messagebox.showerror("Ошибка", f"Ошибка при отправке данных: {e}")


# Эта функция будет вызываться при нажатии на кнопку
def on_button_click():
    user_input1 = entry1.get()
    user_input2 = entry2.get()
    user_input3 = entry3.get()
    device_type = device_type_var.get()
    additional_option = additional_device_var.get()
    issues_input = text_area.get("1.0", "end-1c")

    data = {
        "machine": user_input1,
        "user": user_input2,
        "date": user_input3,
        "device_type": device_type,
        "additional_option": additional_option,
        "issues": issues_input
    }

    messagebox.showinfo("Информация", f"Вы ввели:\nМашина: {user_input1}\nПользователь: {user_input2}\nДата: {user_input3}\nТип устройства: {device_type}\nДополнительно: {additional_option}\nНеполадки оборудования, пожелания, просьбы итд.: {issues_input}")

    send_data_to_server(data)


# Функция для обновления второго Combobox
def update_additional_options(event):
    selected_device = device_type_var.get()
    options = {
        "Принтер": ["Canon MF212w", "Canon MF3010", "Canon 4410/MF4430", "Decelop ineo+ 200", "Epson FX-1000", "Epson FX-1050", "Epson FX-1170", "Epson Fx-2190", "Epson LX-1170", "HP DesigJet 500", "HP LaserJet 5100", "HP LaserJet PRO M227sdn", "Kyosera TASKalfa 2201", "Kyosera TASKalfa 3510i", "OCE OlotWave 300", "Samsung ML-1250", "Samsung SCX-4300", "Xerox DocuOrint P8ex", "Xerox WC 3119", "Xerox WorkCentere M128"],
        "Сканер": ["Epson Perfection 4490"]
    }

    if selected_device in options:
        additional_device_menu['values'] = ["(Выберите устройство)"] + options[selected_device]
        additional_device_menu['state'] = 'readonly'
        additional_device_menu.current(0)
    else:
        additional_device_var.set("(Выберите тип устройства)")
        additional_device_menu['state'] = 'disabled'


# Получение сетевого имени машины, имени пользователя и текущей даты
hostname = socket.gethostname()
username = os.getlogin()
current_date = datetime.today().strftime('%Y-%m-%d')

# Создание основного окна
root = tk.Tk()
root.title("Замена ISP")
root.geometry("600x500")

# Создание фрейма для меток и текстовых полей
frame = tk.Frame(root)
frame.pack(pady=20, padx=20)

# Создание первой метки и текстового поля ввода
tk.Label(frame, text="Машина:").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)
entry1 = tk.Entry(frame)
entry1.grid(row=0, column=1, sticky="ew", padx=5, pady=5)
entry1.insert(0, hostname)

# Создание второй метки и текстового поля ввода
tk.Label(frame, text="Пользователь:").grid(row=1, column=0, sticky=tk.W, padx=5, pady=5)
entry2 = tk.Entry(frame)
entry2.grid(row=1, column=1, sticky="ew", padx=5, pady=5)
entry2.insert(0, username)

# Создание третьей метки и текстового поля ввода
tk.Label(frame, text="Дата:").grid(row=2, column=0, sticky=tk.W, padx=5, pady=5)
entry3 = tk.Entry(frame)
entry3.grid(row=2, column=1, sticky="ew", padx=5, pady=5)
entry3.insert(0, current_date)

#Создание четвёртой метки и Combobox для выбора типа устройства
tk.Label(frame, text="Тип устройства:").grid(row=3, column=0, sticky=tk.W, padx=5, pady=5)
device_type_var = tk.StringVar(value="(Выберите устройство)")
device_type_menu = ttk.Combobox(frame, textvariable=device_type_var,
                                values=["(Выберите устройство)", "Восстановление удалённого файла", "Клавиатура", "Коврик", "Монитор", "Мышь", "Отправка почты", "Пожелать удачного дня", "Принтер", "Программное обеспечение", "Прочее...", "Сеть", "Системный блок", "Сканер"],
                                state="readonly")
device_type_menu.grid(row=3, column=1, sticky="ew", padx=5, pady=5)
device_type_menu.current(0)
device_type_menu.bind("<<ComboboxSelected>>", update_additional_options)

# Создание пятой метки и Combobox для дополнительных опций устройств
tk.Label(frame, text="Дополнительное устройство:").grid(row=4, column=0, sticky=tk.W, padx=5, pady=5)
additional_device_var = tk.StringVar(value="(Выберите устройство)")
additional_device_menu = ttk.Combobox(frame, textvariable=additional_device_var, state="disabled", width=35)
additional_device_menu.grid(row=4, column=1, sticky="ew", padx=5, pady=5)

# Создание метки и области для ввода текста
tk.Label(frame, text="Неполадки оборудования, пожелания, просьбы итд.:").grid(row=5, column=0, columnspan=2, sticky=tk.W, padx=5, pady=5)
text_area = tk.Text(frame, wrap='word', height=10)
text_area.grid(row=6, column=0, columnspan=2, sticky="ew", padx=5, pady=5)

# Создание кнопки
button = tk.Button(root, text="Оформить заказ", command=on_button_click)
button.pack(pady=10)

# Запуск основного цикла
root.mainloop()

Ну вот я его написал и решил сделать из него .exe-файл при помощи команды.
python -m PyInstaller --onedir --windowed что-то.py --noupx
и попробовав запустить этот .exe, я ждал довольно немало, прежде чем скрипт сработал. Как мне уменьшить время открытия файла?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Если проблема именно в "юзер сбит с толку", то её можно обойти, а не решить. Я, например, когда писал гуишную программу, завязанную на numpy, scipy и matplotlib, в итоге плюнул и сделал простой splash screen, который показывается при загрузке и пред-импортирует требуемые модули, показывая прогрессбар. А у pyinstaller есть опция --splash, которая будет показывать прогресс распаковки.

А так - профилируй приложение, выясняй, на чём задержка. Добавь отладочный вывод в самое начало скрипта, до импортов, чтобы понять, идёт ли задержка на этапе запуска интерпретатора, или на этапе ипорта модулей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы