AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77022075
Accepted
d'Elbreil Clément
d'Elbreil Clément
Asked: 2023-09-01 17:45:38 +0800 CST2023-09-01 17:45:38 +0800 CST 2023-09-01 17:45:38 +0800 CST

Dados de imagens do Pyinstaller colocados no arquivo raiz, mas erro não encontrado

  • 772

Criei um exe de um diretório com pyinstaller a partir do meu código-fonte Python. No meu código, eu uso imagens com o caminho relativo da imagem colocado próximo aos arquivos .py.

Ao ler o documento do pyinstaller, tentei 2 coisas: a forma oficial com o -add data e outro método onde copio as imagens diretamente ao lado do main.exe.

Com os 2 métodos, tento iniciar o main.exe e recebo um erro não encontrado:

não foi possível abrir "bdd_trans.png": esse arquivo ou diretório não existe

Então tentei ver onde estava o diretório de trabalho atual ao iniciar o exe com:

from os import getcwd
path = getcwd()
print(path)

Em seguida, colei todas as imagens no diretório impresso e o aplicativo exe funcionou. O problema é que o diretório em que tenho que colocar as imagens está nos dados dos usuários do Windows, que não estão dentro da pasta de construção. Portanto, não posso enviar meu aplicativo para alguém e fazê-lo funcionar instantaneamente, o que é um grande problema.

Alguém sabe por que os métodos oficiais não funcionaram para mim?

Aqui está o comando pyinstaller que estou executando:

pyinstaller --noconfirm --onedir --windowed --icon "C:/app_final_v8/base-de-donnees.ico" --add-data "C:/app_final_v8/actualiser_trans.png;." --add-data "C:/app_final_v8/ajouter_trans.png;." --add-data "C:/app_final_v8/bdd_trans.png;." --add-data "C:/app_final_v8/client_trans.png;." --add-data "C:/app_final_v8/composant_trans.png;." --add-data "C:/app_final_v8/cyxplus_red.png;." --add-data "C:/app_final_v8/employees_trans.png;." --add-data "C:/app_final_v8/equipement_trans.png;." --add-data "C:/app_final_v8/exporter_trans.png;." --add-data "C:/app_final_v8/modifier_trans.png;." --add-data "C:/app_final_v8/quitter_trans.png;." --add-data "C:/app_final_v8/rechercher_trans.png;." --add-data "C:/app_final_v8/retour_trans.png;." --add-data "C:/app_final_v8/site_trans.png;." --add-data "C:/app_final_v8/supprimer_trans.png;." --add-data "C:/app_final_v8/ticket_trans.png;." --add-data "C:/app_final_v8/trait.png;."  "C:/app_final_v8/main.py"

Aqui está a saída tentando executar o exe:

Traceback (most recent call last):
  File "main.py", line 7, in <module>
  File "app.py", line 98, in __init__
  File "page_accueil.py", line 26, in __init__
  File "tkinter\__init__.py", line 4061, in __init__
  File "tkinter\__init__.py", line 4006, in __init__
_tkinter.TclError: couldn't open "bdd_trans.png": no such file or directory
[11300] Failed to execute script 'main' due to unhandled exception!

Veja como eu uso as imagens de dados:

correspondance_table_icone = {
    "activite_client": "trait.png",
    "type_anomalie": "trait.png",
    "client": "client_trans.png",
    "composant": "composant_trans.png",
    "contrat_maintenance": "trait.png",
    "employe":"employees_trans.png",
    "equipement": "equipement_trans.png",
    "extension_chrono": "trait.png",
    "fabricant_composant": "trait.png",
    "fonction_composant": "trait.png",
    "pays": "trait.png",
    "sous_client": "trait.png",
    "ticket": "ticket_trans.png",
    "trigramme": "trait.png",
    "type_equipement": "trait.png",
    "type_ticket": "trait.png",
    "site": "site_trans.png",
    "ville": "trait.png"
}
for ligne in range(len(controller.base.nom_tables)):
            table = controller.base.nom_tables[ligne]
            icon_image = PhotoImage(file = correspondance_table_icone[table])
            self.dict_bouton_tab[table] = tb.Button(canvas_tab.interior, text = correspondance_table_tab[table][0], image=icon_image, compound="left", style = 'Custom_tab.Outline.TButton', command = lambda _table = table: self.afficher_table(controller.base, _table), bootstyle = INFO)
            self.dict_bouton_tab[table].image = icon_image
            self.dict_bouton_tab[table].grid(row = correspondance_table_tab[table][1], column = 0, sticky = "nsew")
python
  • 1 1 respostas
  • 17 Views

1 respostas

  • Voted
  1. Best Answer
    Gordian
    2023-09-01T18:48:48+08:002023-09-01T18:48:48+08:00

    O Tkinter não sabe a localização do seu bdd_trans.png. Você precisa modificar seu programa para poder detectar os arquivos. Sugiro fazer o seguinte:


    1. Crie um arquivo de especificação para todos os seus arquivos! Adicionar todas as imagens uma por uma é uma prática inadequada e cria redundâncias. Para obter mais informações sobre como criar arquivo de especificação, consulte: Arquivos de especificação do Pyinstaller

    1. Crie um script Python (por exemplo, 'add_lib.py') com o seguinte conteúdo:
    import sys,os
    sys.path.append(os.path.join(os.getcwd(), 'lib'))
    

    sys.path contém diretórios nos quais o Python procura módulos importados e arquivos semelhantes. Ao anexar o caminho da sua subpasta, você permite que o interpretador Python encontre os arquivos movidos. No código acima, sys.path contém o diretório de trabalho atual (getcwd) e o nome da subpasta 'lib', que pode ser ajustado para qualquer nome que você desejar.


    1. Adicione seu script python ('add_lib.py') à lista de ganchos de tempo de execução e construa seu programa com PyInstaller:

    Qualquer gancho de tempo de execução fornecido será executado antes do script principal. Você pode simplesmente modificar seu arquivo *.spec ou usar o comando de console correspondente:

    pyinstaller main.py --runtime-hook add_lib.py
    

    1. Mova a maioria dos arquivos (não pastas) para o seu subdiretório

    Para uma explicação detalhada, consulte o seguinte artigo médio .

    • 1

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve