Не отображаются картинки в PyQT + Pyinstaller
При попытке собрать exe файл python, в скомпилированной программе не видно иконок. Как бы я не пытался, у меня не получается сделать так, чтобы они появились. Вот сама проблема:
main.spec:
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[(r'C:\Users\PfeyferNY\Desktop\converter-yaml-to-json\images\gnivc2.png', 'images')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['C:\\Users\\PfeyferNY\\Desktop\\converter-yaml-to-json\\images\\iconlogo3.ico'],
)
main.py:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QColor, QIcon
from PyQt5.uic import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
import os
from ruamel.yaml import YAML
from ruamel.yaml.constructor import SafeConstructor
import json
import yaml
import psycopg2
from psycopg2 import Error
from py_windows.mainNew import Ui_MainWindow
from py_windows.informationsNew import Ui_MainWindow2
class Main_Screen(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Main_Screen, self).__init__(parent)
self.setupUi(self)
class Informations_Screen(QtWidgets.QMainWindow, Ui_MainWindow2):
def __init__(self, parent=None):
super(Informations_Screen, self).__init__(parent)
self.setupUi(self)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.fname = ""
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
#Начало класса Main_Screen
self.main_screen = Main_Screen()
# self.main_screen.pushButton_2.clicked.connect(self.add_file)
# self.main_screen.pushButton.clicked.connect(self.save_file)
# self.main_screen.pushButton_3.clicked.connect(self.gotoInformationScreen)
self.main_screen.addFile.clicked.connect(self.add_file)
self.main_screen.convert.clicked.connect(self.save_file)
self.main_screen.info.clicked.connect(self.gotoInformationScreen)
self.main_screen.add.clicked.connect(self.add_in_database)
#Конец класса Main_Screen
#Начало класса Informations_Screen
self.informations_screen = Informations_Screen()
self.informations_screen.back.clicked.connect(self.gotomain)
#Конец класса Informations_Screen
self.stack = QStackedWidget() # QStackedWidget видно сразу несколько виджетов
self.stack.addWidget(self.main_screen) # 0 self.stack.setCurrentIndex(0)
self.stack.addWidget(self.informations_screen) # 1 self.stack.setCurrentIndex(0)
self.stack.setCurrentIndex(0)
self.nameProgramm(self.stack.currentIndex())
self.gotomain()
hbox = QHBoxLayout(self.centralWidget)
hbox.setContentsMargins(0, 0, 0, 0) #вроде можно без этого ????????????????????????????????????
hbox.addWidget(self.stack)
def nameProgramm(self, w=0):
# self.setWindowTitle('Конвертер YML to JSON')
# self.setWindowIcon(QIcon('C:\\Users\\Admin\\Desktop\\converterGUI\\images\\gnvclogo.png'))
self.setWindowTitle('Конвертер YML to JSON')
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
icon_path = os.path.join(base_path, 'images', 'iconlogo3.png')
self.setWindowIcon(QIcon(icon_path))
def gotomain(self):
self.stack.setCurrentIndex(0)
self.nameProgramm(self.stack.currentIndex())
#self.setFixedSize(421, 516)
def gotoInformationScreen(self):
self.stack.setCurrentIndex(1)
self.nameProgramm(self.stack.currentIndex())
#self.setFixedSize(421, 516)
def add_file(self):
self.fname, _ = QFileDialog.getOpenFileName(self,"Open file", ".", "YAML Files (*.yml)")
if self.fname:
base_name = os.path.basename(self.fname) #Только для верхнего поля
self.main_screen.lineEdit_3.setText(base_name)
def add_file_json(self):
self.fname, _ = QFileDialog.getOpenFileName(self, "Open file", ".", "JSON Files (*.json)")
if self.fname:
base_name = os.path.basename(self.fname) #Только для верхнего поля
self.main_screen.lineEdit_3.setText(base_name)
def save_file(self):
if self.fname:
try:
# Предполагается, что SplitFileByDuplicates может вызывать исключения
SplitFileByDuplicates(self.fname)
self.main_screen.lineEdit_3.setText("Конвертация завершена!")
self.main_screen.lineEdit_3.setStyleSheet("background-color: rgb(66, 71, 90);"
"color: green;"
"font-weight: bold;"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;")
QTimer.singleShot(3000, self.clear_message)
self.fname = ""
except Exception as e:
# Если произошло исключение, обработаем его и покажем сообщение об ошибке
self.main_screen.lineEdit_3.setText("Ошибочный файл")
self.main_screen.lineEdit_3.setStyleSheet("background-color: rgb(66, 71, 90);"
"color: red;"
"font-weight: bold;"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;")
QTimer.singleShot(3000, self.clear_message)
self.show_error_message("Вы выбрали файл, содержащий не подходящую структуру. Пожалуйста выберите правильный файл!")
else:
self.main_screen.lineEdit_3.setText("Ошибка конвертации!")
self.main_screen.lineEdit_3.setStyleSheet("background-color: rgb(66, 71, 90);"
"color: red;"
"font-weight: bold;"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;")
QTimer.singleShot(3000, self.clear_message)
self.show_error_message("Пожалуйста выберите файл для конвертации!")
info_about_file = -1
#Работает
def add_in_database(self):
global info_about_file
try:
with open("configuration.yml", 'r') as file:
config_data = yaml.safe_load(file)
if "postgresql" in config_data:
result = config_data["postgresql"]
try:
self.add_file_json() #Тут происходит выбор файла, который надо загружать в базу
self.connectt(result['user'],
result['password'],
result['host'],
result['port'],
result['database'],
result['options'],
result['table'])
if info_about_file == 0:
self.main_screen.lineEdit_3.setText("Успешно!")
self.main_screen.lineEdit_3.setStyleSheet("background-color: rgb(66, 71, 90);"
"color: green;"
"font-weight: bold;"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;")
QTimer.singleShot(3000, self.clear_message)
info_about_file = -1
if info_about_file == 1:
self.main_screen.lineEdit_3.setText("Json файл не найден!")
self.main_screen.lineEdit_3.setStyleSheet("background-color: rgb(66, 71, 90);"
"color: red;"
"font-weight: bold;"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;")
QTimer.singleShot(3000, self.clear_message)
self.show_error_message("Json файл не найден. Пожалуйста проверьте наличие файла")
info_about_file = 0
except Exception as e:
self.show_error_message("Проверьте правильность заполнения конфигурационного файла. Возможно, у вас нет доступа или в JSON файле присутствует ошибка.")
else:
self.show_error_message(f"Секция 'postgresql' не найдена в конфигурационном файле.")
except FileNotFoundError:
self.show_error_message("Конфигурационный файл не найден. Пожалуйста убедитесь, что конфигурационный файл находится в одной папке с программой и называется: 'configuration.yml'")
#Показать сообщение об ошибке
def show_error_message(self, message):
info = QMessageBox(self)
info.setIcon(QMessageBox.Warning) # Устанавливаем тип иконки внутри окна
info.setWindowTitle("Ошибка")
info.setText(message)
info.setStandardButtons(QMessageBox.Ok)
# Устанавливаем внешнюю иконку для окна
if hasattr(sys, '_MEIPASS'):
# PyInstaller creates a temp folder and stores the path in _MEIPASS
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
icon_path = os.path.join(base_path, 'images', 'gnivc2.png')
else:
# When running locally
icon_path = os.path.join(os.path.dirname(__file__), 'images', 'gnivc2.png')
# Устанавливаем внешнюю иконку для окна
info.setWindowIcon(QIcon(icon_path))
# Устанавливаем стиль для изменения фона
info.setStyleSheet("""
QMessageBox {
background-color: rgb(17, 18, 21);
}
QMessageBox QLabel {
color: rgb(255, 255, 255); /* Цвет текста */
}
QPushButton {
color: white;
background-color: rgb(151, 102, 255);
}
""")
info.exec_()
#Очиска поля с информацией
def clear_message(self):
self.main_screen.lineEdit_3.setText("")
self.main_screen.lineEdit_3.setStyleSheet("background-color: rgb(66, 71, 90);\n"
"color: rgb(162, 162, 162);\n"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;")
#Выгрузка данных в базу
def connectt(self, user, password, host, port, database, options, table):
global info_about_file
try:
# Подключение к существующей базе данных
connection = psycopg2.connect(user=user,
password=password,
host=host,
port=port,
database=database,
options=options)
connection.autocommit = True
# Курсор для выполнения операций с базой данных
cursor = connection.cursor()
# documents_folder = os.path.join(os.path.expanduser("~"), "Documents")
# json_file_name = os.path.join(documents_folder, os.path.splitext(os.path.basename("pvd_deploy_template_koeiz"))[0] + ".json")
# print(self.fname)
try:
with open(self.fname, 'r') as file:
content = file.read()
data = json.loads(content)
except FileNotFoundError:
info_about_file = 1
print("Json файл не найден")
return
cursor.execute("""SET ROLE ais3;""")
# cursor.execute("""SET SEARCH_PATH=demo;""")
for item in data:
server_name = item['hostname']
server_role = item['data']
cursor.execute(f"""INSERT INTO {table} (server_name, server_role) VALUES (%s, %s);""",
(server_name, json.dumps(server_role)))
print("Всё хорошо")
info_about_file = 0
# except psycopg2.errors.UndefinedTable:
# info_about_file = 1
# print("Ошибка: таблица не найдена")
except (Exception, Error) as error:
# info_about_file = 1
print("Ошибка при работе с PostgreSQL", error)
finally:
if connection:
cursor.close()
connection.close()
print("Соединение с PostgreSQL закрыто")
self.fname = ""
#Функция конвертации
def SplitFileByDuplicates(file_name):
def construct_yaml_map(self, node):
data = []
yield data
for key_node, value_node in node.value:
key = self.construct_object(key_node, deep=True)
val = self.construct_object(value_node, deep=True)
data.append((key, val))
#try:
with open(file_name, "r") as f:
SafeConstructor.add_constructor(u'tag:yaml.org,2002:map', construct_yaml_map)
yaml = YAML(typ='safe')
data = yaml.load(f.read())
result = []
for i in data:
if i[0] == 'servers':
result.append(i)
servers = result[0][1]
def create_partition(server_list):
documents_folder = os.path.join(os.path.expanduser("~"), "Documents")
json_file_name = os.path.join(documents_folder, os.path.splitext(os.path.basename(file_name))[0] + ".json")
with open(json_file_name, "w") as f:
json.dump(server_list, f, indent=4)
server_list = []
for server in servers:
server_name = server[0]
server_data = server[1]
server_entry = {
"hostname": server_name,
"data": {k: v for k, v in server_data}
}
server_list.append(server_entry)
if server_list:
create_partition(server_list)
def application():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
application()
mainNew.py (QT файл):
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mainNew.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(443, 592)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setStyleSheet("#centralwidget{background-color: rgb(17, 18, 21);}")
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setMinimumSize(QtCore.QSize(165, 38))
self.widget.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.widget.setStyleSheet("background-color: rgb(17, 18, 21);")
self.widget.setObjectName("widget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setStyleSheet("color: rgb(151, 102, 255);")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout_2.addWidget(self.label)
self.verticalLayout.addWidget(self.widget, 0, QtCore.Qt.AlignHCenter)
self.widget_2 = QtWidgets.QWidget(self.centralwidget)
self.widget_2.setMinimumSize(QtCore.QSize(421, 104))
self.widget_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.widget_2.setStyleSheet("background-color: rgb(23, 25, 33);")
self.widget_2.setObjectName("widget_2")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.widget_2)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.line = QtWidgets.QFrame(self.widget_2)
self.line.setStyleSheet("background-color: rgb(151, 102, 255);")
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.verticalLayout_3.addWidget(self.line)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.label_2 = QtWidgets.QLabel(self.widget_2)
self.label_2.setMinimumSize(QtCore.QSize(61, 60))
self.label_2.setMaximumSize(QtCore.QSize(61, 60))
self.label_2.setStyleSheet("background-image: url(:/file/images/yml3.png);")
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
self.lineEdit_3 = QtWidgets.QLineEdit(self.widget_2)
self.lineEdit_3.setMinimumSize(QtCore.QSize(271, 31))
self.lineEdit_3.setMaximumSize(QtCore.QSize(291, 16777215))
self.lineEdit_3.setStyleSheet("background-color: rgb(66, 71, 90);\n"
"color: rgb(162, 162, 162);\n"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;")
self.lineEdit_3.setCursorPosition(0)
self.lineEdit_3.setAlignment(QtCore.Qt.AlignCenter)
self.lineEdit_3.setObjectName("lineEdit_3")
self.horizontalLayout.addWidget(self.lineEdit_3)
self.label_3 = QtWidgets.QLabel(self.widget_2)
self.label_3.setMinimumSize(QtCore.QSize(61, 60))
self.label_3.setMaximumSize(QtCore.QSize(61, 60))
self.label_3.setStyleSheet("background-image: url(:/file/images/json3.png);")
self.label_3.setText("")
self.label_3.setObjectName("label_3")
self.horizontalLayout.addWidget(self.label_3)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.verticalLayout_3.addLayout(self.horizontalLayout)
self.line_2 = QtWidgets.QFrame(self.widget_2)
self.line_2.setStyleSheet("background-color: rgb(151, 102, 255);")
self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line_2.setObjectName("line_2")
self.verticalLayout_3.addWidget(self.line_2)
self.verticalLayout.addWidget(self.widget_2)
self.widget_3 = QtWidgets.QWidget(self.centralwidget)
self.widget_3.setMinimumSize(QtCore.QSize(0, 414))
self.widget_3.setStyleSheet("background-color: rgb(17, 18, 21);")
self.widget_3.setObjectName("widget_3")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.widget_3)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setContentsMargins(-1, 0, -1, 0)
self.verticalLayout_4.setSpacing(13)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.addFile = QtWidgets.QPushButton(self.widget_3)
self.addFile.setMinimumSize(QtCore.QSize(211, 31))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.addFile.setFont(font)
self.addFile.setStyleSheet("#addFile {\n"
" background-color: rgb(151, 102, 255);\n"
"/*background-color: rgb(0, 139, 247);*/\n"
" color: rgb(255, 255, 255);\n"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;}\n"
"\n"
"\n"
"#addFile:hover{\n"
"background-color: rgb(164, 205, 217);\n"
"}")
self.addFile.setObjectName("addFile")
self.verticalLayout_4.addWidget(self.addFile)
self.convert = QtWidgets.QPushButton(self.widget_3)
self.convert.setMinimumSize(QtCore.QSize(211, 31))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.convert.setFont(font)
self.convert.setStyleSheet("#convert {\n"
"background-color: rgb(151, 102, 255);\n"
"/*background-color: rgb(0, 139, 247);*/\n"
" color: rgb(255, 255, 255);\n"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;}\n"
"\n"
"\n"
"#convert:hover{\n"
"background-color: rgb(164, 205, 217);\n"
"}")
self.convert.setObjectName("convert")
self.verticalLayout_4.addWidget(self.convert)
self.add = QtWidgets.QPushButton(self.widget_3)
self.add.setMinimumSize(QtCore.QSize(211, 31))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.add.setFont(font)
self.add.setStyleSheet("#add {\n"
"background-color: rgb(151, 102, 255);\n"
"/*background-color: rgb(0, 139, 247);*/\n"
" color: rgb(255, 255, 255);\n"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;}\n"
"\n"
"\n"
"#add:hover{\n"
"background-color: rgb(164, 205, 217);\n"
"}")
self.add.setObjectName("add")
self.verticalLayout_4.addWidget(self.add)
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem2)
self.label_4 = QtWidgets.QLabel(self.widget_3)
self.label_4.setMinimumSize(QtCore.QSize(200, 200))
self.label_4.setMaximumSize(QtCore.QSize(9999, 9999))
self.label_4.setStyleSheet("background-image: url(:/file/images/gnvclogo.png);")
self.label_4.setText("")
self.label_4.setObjectName("label_4")
self.verticalLayout_4.addWidget(self.label_4, 0, QtCore.Qt.AlignHCenter)
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem3)
self.info = QtWidgets.QPushButton(self.widget_3)
self.info.setMinimumSize(QtCore.QSize(211, 31))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.info.setFont(font)
self.info.setStyleSheet("#info {\n"
"background-color: rgb(151, 102, 255);\n"
"/*background-color: rgb(0, 139, 247);*/\n"
" color: rgb(255, 255, 255);\n"
"border-radius: 15px; /* Задайте радиус, чтобы сделать края овальными */\n"
"padding: 2px;}\n"
"\n"
"\n"
"#info:hover{\n"
"background-color: rgb(164, 205, 217);\n"
"}")
self.info.setObjectName("info")
self.verticalLayout_4.addWidget(self.info)
self.verticalLayout_5.addLayout(self.verticalLayout_4)
self.verticalLayout.addWidget(self.widget_3, 0, QtCore.Qt.AlignHCenter)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Конвертация YML в JSON"))
self.lineEdit_3.setPlaceholderText(_translate("MainWindow", "Название файла.yml"))
self.addFile.setText(_translate("MainWindow", "Выбрать файл"))
self.convert.setText(_translate("MainWindow", "Конвертировать"))
self.add.setText(_translate("MainWindow", "Добавить Json в Базу даных"))
self.info.setText(_translate("MainWindow", "Дополнительная информация"))
import qrc_files.file
Ответы (1 шт):
На сайте pyinstaller указаны опции использования. Если Вам нужно включить в проект дополнительные файлы, в .cmd должна быть одна относительно простая команда:
pyinstaller -y --uac-admin --clean ^
--onedir --runtime-tmpdir="." --distpath="." --contents-directory="Runtimes" ^
--add-data=".\ICONS\icon1.ico;ICONS" ^
--add-data=".\ICONS\icon2.ico;ICONS" ^
--hide-console=hide-early --icon=.\ICONS\app.png .\myproject.py
Взаимодействие с включёнными в автономную сборку дополнительными файлами - уже Ваша проблема. Предлагаю самостоятельно сходить всё-таки на сайт и посмотреть о чём каждая из опций.
Кроме того, в проектах можно вообще не ссылаться на графические файлы. Их можно встраивать прямо в код скрипта. Это уменьшает количество потенциальных проблем. Пример:
images_app = tkinter.PhotoImage(data = base64.b64decode(r"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAZElEQVR42u3TwQ2AQAhEUeiMUizNUugM7xoxm4ybNf65QuAdwM2sTBsfbS6VwAEA+AVgaPpbgNhDsjy3BLAgQH1kHfYekKLHDAcA4COAa2Uu4JwCAACAEvCUGYBWAWBRgDYt4AB1vYwN5931twAAAABJRU5ErkJggg=="))
root.iconphoto(True, images_app)