Каким образом сделать макрос питона на замену выделенного библиотечного .kle элемента?
т.е.:
есть сборка, в нее подключен/а деталь/сборка из библиотеки .kle.
в свойствах детали/сборки указан 'файл-источник' C:\Program Files\ASCON\KOMPAS-3D v19\Libs\mylib.kle|Сборка.a3d
необходимо заменить на C:\Program Files\ASCON\KOMPAS-3D v19\Libs\mylib.kle|Сборка_22.a3d
примерная реализация:
жмешь макрос, он выкидывает окно, в котором ты вставляешь 'путь к библиотеке|сборка' или просто имя сборки (второй вариант предпочтительней), жмешь ок или enter и макрос меняет путь в графе 'файл-источник' и перестраивает сборку.
p.s. может не полностью, но хотябы в какую сторону копать...
Полученный результат:
import pythoncom
from win32com.client import Dispatch, gencache
# Подключим описание интерфейсов API5
KAPI = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
iKompasObject = KAPI.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(KAPI.KompasObject.CLSID, pythoncom.IID_IDispatch))
iDocument3D = iKompasObject.ActiveDocument3D()
# GetSelectionMng - Получить указатель на интерфейс менеджера выделенных объектов
SlcMan = iDocument3D.GetSelectionMng()
# SlcMan.GetCount - Считывание количества выделенных объектов
Count = SlcMan.GetCount()
# Срез пути до файла библиотеки
Part0 = SlcMan.GetObjectByIndex (0)
PathName = Part0.fileName
i = len(PathName)
n = 0
for n in range(0,i,1):
if PathName[n] == '|':
break
Lib = PathName[0:n+1]
# Собираем путь к библиотеке и имя файла
Name = 'Сборка_22.a3d'
LibName = Lib + Name
# Производим замену всех выделенных элементов
n=0
Part = {}
for n in range(0,Count,1):
Part[n] = SlcMan.GetObjectByIndex (n)
Part[n].fileName = LibName
for n in range(0,Count,1):
Part[n].Update()
сделал приложение.
для замены нужно:
1) выделить объекты,
2) вписать/вставить название заменяемого файла без директорий.
3) нажать замена
Library.png
https://disk.yandex.ru/d/v9yBYywgKT2TgQ
5 копеек...
Лучше если у пользователя будет возможность выбирать новый компонент(деталь, сборку) из готового списка (надо этот список библиотечных элементов сформировать и показать пользователю).
p3452, знаю, уже пытаюсь что-то сделать.
Для начала и это уже неплохо.... хоть как-то заменить можно.
Неплохо! Для питона 2.6 можно сварганить?
Умка, вообще можно, но я неверное не буду этого делать.
питон разный и придется исправлять и подгонять, а времени особо нет.
а какой питон, 2.6.0 или 2.6.7 ?
питон 2.6.2 на нём много хороших скриптов.
Можно так сделать со списком
https://yadi.sk/d/p-CpHKSea8N-ZA
В папке где находится файл с программой(test_Library.pyw) создаем папку Detail.
Выгружаем все из библиотеки kle в папку Detail.
1.png
Запускаем программу. Получаем listbox со всеми деталями из библиотеки.
Выбираем в сборке библиотечные детали, которые нужно заменить. В listboxe выделяем строку с нужной деталью и 2 раза щелкаем левой кнопкой мыши.
Происходит замена.
Если структура библиотеки kle разветвленная то удобнее вместо listbox использовать treeview
Михаил88, а можно дописать программу и будет приблизительно так...
(и к слову, распаковывать весь архив чтобы вывести содержимое нет смысла, потому что все файлы будут в куче,
достаточно распаковать файл 'FileInfo.ru' и вывести его содержимое должным образом.)
Screenshot_1.jpg
Умка, а если упаковать программу в .exe файл с помощью nuitka или pyinstaller то можно будет запускать независимо от того какой python стоит в OS, главное чтобы сама OS поддерживала этот python.
biomotor, если распаковать kle , как я показал на скриншоте то структура полностью сохранится. С файла FileInfo.ru думаю тоже можно достать ту же инфу.
то что у вас показано на скриншоте тоже можно сделать через treeview
изображение_2021-06-18_113503.png
вот так можно сделать
Михаил88, то что у меня на скриншоте уже сделано через treeview...
(где же Вы были раньше?)
Михаил88, а v1.05 можно глянуть?
Всё-же лучше оное упаковать в exe.
biomotor, пока не получится посмотреть в процессе разработки, но она немного для других целей. Спрашивайте если, что то интересует.
Михаил88, интересует код на отображение иконок, и на окно предпросмотра. долго махаетесь с ней?
Цитата: Умка от 18.06.21, 12:11:53Всё-же лучше оное упаковать в exe.
На ЭТОМ, обычно, и заканчивается "любовь" к Python :angel:
biomotor, при вставке строки в treeview можно передать параметр image
справа в label вставляется тот же рисунок.
Если надо могу сделать пример?
При выборе строки в tree в label будет показываться нужный рисунок
да, если можно примерчик пожалуйста...
Хорошо сделаю.
Михаил88, Если есть возможность, не откажусь от помощи в разработке кода.... :)
сейчас скину
https://yadi.sk/d/6LEceU0Q2Ch5Gw
здесь библиотека 3D
2 файла, pyw и exe
запускаем файл появляются 2 папки (imag и Detail) в директории где находится файл программы.
в папку Detail скидываем свои модели в дальнейшем структура в treeview будет зависеть от того, как и где будут расположены файлы.
Screenshot_2.png
В программе нажимаем файл -> обновить данные
Идет обновление данных (происходит обновление в папке imag).
Screenshot_1.png
Далее в сборке выбираем нужные детали и 2 нажатием по левой кнопке мыши выбираем нужную деталь в tree программы
Происходит замена
Как сделать выгрузку деталей из kle с сохранением структуры смотри выше.
Screenshot_3.png
при выделение строки в tree в окне просмотра справа будет отображаться деталь
Михаил88, честно говоря не уверен что распаковка всей библиотеки это хорошая идея, постоянно иметь запас памяти на hdd/ssd диске, и русурсы ПК чтобы распаковать... мой вариант распаковывает только xml файл из библиотеки, и читает все данные с него. я наверное у себя сделаю тоже кнопку обновить данные, но не буду оставлять сами файлы на hdd/ssd диске. Т.е. при каждом запуске будет читаться файл xml, если он отсутствует, происходит 'обновить данные' (распаковка -> png -> удаление моделей). Последующие запуски будут просто читать png и xml файл.
Можете помочь с конвертацией в exe ? у меня постоянно ошибки вылезают...
В вашем коде используются одни и те же png для каждой строки и для предпросмотра, верно?
Как получить data от png?
Вот что пока что получается у меня...
Screenshot_1.jpg
понятно, это ведь только для примера. В моей библиотеке мне нужны модели, по этому сделал так.
я создаю exe c помощью pyinstaller. Что вы пишите в командную строку?
да я использую одни и теже png.
для получения data конвертирую картинку (в документации написано ,что лучше использовать формат gif) в base64 (https://base64.guru/converter/encode/image/gif)
после этого она включится в состав программы
Цитата: biomotor от 21.06.21, 08:45:51мой вариант распаковывает только xml файл из библиотеки, и читает все данные с него
+
И еще, как вариант - есть такое приложение "TemplateManager" (Менеджере типовых элементов), лежит в папке Lib - возможно это то что вам надо (и даже более...).
Михаил88, pyinstaller -F myprog.py , Нужно ли подключать библиотеки dll из Win 10 ?
я не подключаю
можете скинуть мне прогу я у себя попробую создать exe
Вот ссылка на простое приложение которое у меня с кучей ошибок. еще и не создается exe.
https://disk.yandex.ru/d/t3DhXKAB6nxklQ
Screenshot_1.jpg
https://yadi.sk/d/pbR4xCEC4SWeJg
так должно получиться?
Оно, только что-то у меня не собирается...
пробовал и так:
set PATH=%PATH%;C:\Windows\System32\downlevel
и так:
set PATH=%PATH%;C:\Windows\SysWOW64\downlevel
и так:
set PATH=%PATH%;C:\Program Files\JetBrains\PyCharm 2020.1\jbr\bin
может что-то нужно еще? Visual C++ или еще что?
я за комментировал эту строку
style.map("Horizontal.TProgressbar", troughrelief = 'flat')
у меня на ней ошибку выдавало
Еще я использую python 3.6 и pyinstaller 4.2
чет я не найду Pyinstaller в списке установленных модулей...
py -m pydoc modules
pip list
класть программу в корень с pyinstaller?
Python 3.9.2
pyinstaller 3.3.1
pip install pyinstaller не обновляет его до 4.2...
при попытке обновления таким образом, происходит куча ошибок...
pip install --upgrade pyinstaller
(он перебирает версии вниз до 3.3.1 и везде ошибки.)
так тоже ошибки
pip install https://github.com/pyinstaller/pyinstaller/tarball/develop
Имя пользователя русскими или английскими? возможно связано с этим.
я попробовал удалить полностью и установить из уже скачанного архива 4.3 - неполучилось
попробовал закинуть в папку python - неполучилось
pip install pyinstaller==4.2
так можно откатить
еще папку с проектом ложить в С
в названии папки и файла программы должны быть только латинские буквы
я так делаю и все ок
куда установлен питон? у меня C:\Python39\
имя пользователя OS у Вас латиницей? у меня кирилицей.
команда pip install pyinstaller==4.2 тоже не сработала.
Создал нового пользователя латиницей, установил pyinstaller, перезашел обратно, заработало вроде....
у меня латиницей
я не понял смогли exe создать или нет?
да exe смог создать,
но столкнулся с очередным костылем:
https://disk.yandex.ru/d/v9yBYywgKT2TgQ если сконвертировать этот файл, кнопки не срабатывают почему-то...
для выхода использовал exit(), а нужно было root.destroy()
но с другой кнопкой пока не понятно... GetSelectionMng() не срабатывает
text='🗙'
text='🗘'
надо заменить на
text='x'
text='<>'
если охота, чтобы было красиво установить картинки на эти кнопки
у меня тоже в этих строках ошибки, что то с юникодом связано разбираться не когда, проще поставить картинки
теперь вы знаете как это делается
у меня тоже не заработало, надо разбираться
сейчас нету времени
но в прошлый раз когда вы эту прогу скидывали я с нее создавал exe без проблем, правда я ее корректировал
позже посмотрю
У меня собралось и работает, все что написал выше заменил и все стало ок. Сначала забыл a3d на m3d заменить.
Еще из функции start exit() убрал он там не нужен
https://yadi.sk/d/WBw23m5YGAumOQ
Михаил88, я тоже собрал. но у меня при запуске мышка думать начинает...
на счет текста у меня не ругался, это символы юникода.
я не хотел использовать картинки по причине того что в стоковом функционале tkinter нет возможности сделать картинку в виде 'data', для того чтобы не использовать отдельный файл, или я ошибаюсь?
или быть может проще сделать dll файл с изображениями? и просто читать их оттуда?
я же не использовал отдельный файл
после конвертации получил текстовый код записываем его в переменную
например data_png ='R0lGODlhLQAtAIcAAAAAAP8AAP8YGP85Of9zc/8hIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAAACwAAAAALQAtAAAI7gABCBxIsKDBgwgTKlzIsKHDhxAREigwICLBAQUIRBQQoGMAiwA8BhDwkKPIjxBPjmxoUuVDlR1JKmwJsyFMjzIP0ry58KbInAQJ+DyZcKhIjQULGBV5cKnHAgYHOPVYcGrHigatdhyoFWVTrSHBKuwqtifZpS/P+oyotqbFtkxBhm0rl6vaugTP4q1adu/cvnXp4oXr9S3hwmkPI2aoOK7Nxo7HQiYq2epfp0XLdj0o1XJeq1gJKp361SnUgkIxI5yKtOBOt5mHAnU99PHN2QZfb3V4m6XLlCdxJ6QJ8mfEi'
Далее ссылаемся на эту переменную
такой вариант прекрасно подойдет для картинок, которые будут стандартно использованы и не должны меняться.
картинки которые будут обновляться вам уже решать как хранить
Может кто-нибудь знает ,как вообще без этих манипуляций с картинками сделать предпросмотр на python.
При сборке пайинсталлером в пути не должно быть кириллицы. Пользователь на кириллице тут не причём.
Цитата: Михаил88 от 21.06.21, 17:32:55Может кто-нибудь знает ,как вообще без этих манипуляций с картинками сделать предпросмотр на python.
Для страждущих - "Preview документов в программе на Python (https://habr.com/ru/post/344086/)".
Спасибо, за ссылку. Ранее уже читал эту статью. Там он еще С использует.
pr0100, неверно!
полный путь: C:\ex\progressbar.py. Где тут латиница?
я не пог обновить pyinstaller с версии 3.3.1 до версии 4.3, потому что пользователь кирилицей,
я создал нового пользователя только латиницей, перезашел в него, обновил из него pyinstaller до версии 4.3,
вышел из пользователя, зашел в пользователя кирилицей, и все заработало!
Михаил88, p3452, а есть ли возможность смотреть превьюшки в архиве, не извлекая файлы? rar, zip ???
Вот нашел ссылку:
https://ocomp.info/kak-prosmatrivat-foto-v-arhive.html
(самый идеальный варинт был бы, смотреть превьюхи напрямую из архива, не распаковывая,
только структуры папок там нет, хотя это может быть и неважно, так же из xml прочитать...)
я не знаю
Михаил88, на форуме вроде где-то была функция добавления компонента в сборку, Вы не видели?
В SDK все описано, на форуме тоже полно информации
Screenshot_1.png
Screenshot_2.png
Михаил88, спасибо
Цитата: biomotor от 22.06.21, 08:46:12а есть ли возможность смотреть превьюшки в архиве, не извлекая файлы?
Есть!
Но говорить об этом будет иметь смысл если осилите, хотя-бы, чтение содержимого архива.
p3452, что Вы под этим подразумеваете? см. скрины что я кидал выше. структура архива показана. что еще нужно?
можно еще так...
import zipfile
zipfile.is_zipfile('ex.kle')
z = zipfile.ZipFile('ex.kle', 'r')
z.printdir()
Цитата: biomotor от 22.06.21, 16:24:06выше. структура архива показана.
Ну! Тогда дело за малым:
- разархивировать не на диск, а в память,
- читать нужные метаданные из нужного файла в памяти (через поток или массив байт - так на C#, как это будет на Python, вам виднее).
p3452, разархивировать в память, спорный вопрос, если у меня 50-100 мб архива, то это не так важно, но когда библиотека наполнится до 1-2 гб, все это пихать в память? какой смысл так нагружать OS? проще всего на мой взгляд вообще без превьюшек обойтись, но всетаки с ними поудобней, поэтому я считаю что та схема которую я выбрал выше самая адекватная.
Михаил88, а выпробовали использовать BitmapImage и иконки в виде кода? у меня не получилось собрать иконку.
что лучше BitmapImage или PhotoImage всетаки?
наверное основные различия:
BitmapImage представляет собой простое двухцветное изображение, PhotoImage – полноцветное изображение.
PhotoImage позволяет использовать полноцветное изображение. Кроме того у этого класса есть несколько (достаточно примитивных) методов для работы с изображениями. PhotoImage гарантированно понимает формат GIF.
выходит BitmapImage - примитив 2 цветов, чего нам обычно нехватает.... поэтому наверное удобней использовать PhotoImage.
кроме того PhotoImage может работать с альфа каналом.
Не получилось собрать иконку самого приложения? Я что то не совсем понял.
Михаил88, есть ли аналог https://base64.guru/converter/encode/image/gif
только для BitmapImage?
с PhotoImage дела обстоят печально, не получается убрать border, и четко обозначить размер иконки.
если поставить на frame, то получается что frame подстраивается под размеры PhotoImage, хотя размеры четко заданы и большего размера.
from tkinter import *
''
data = '''#define smile_width 15
#define smile_height 15
static unsigned char smile_bits[] = {
0x00, 0x00, 0x80, 0x00, 0x70, 0x07, 0x08, 0x08, 0x04, 0x10, 0x04, 0x10,
0x74, 0x17, 0x02, 0x20, 0x04, 0x10, 0x14, 0x14, 0xe4, 0x13, 0x08, 0x08,
0x70, 0x07, 0x80, 0x00, 0x00, 0x00 };'''
root=Tk()
image = BitmapImage(data=data, background='red', foreground='green')
button=Button(root, image=image)
button.pack()
root.mainloop()
нашел такой пример, но как изображение в data перевести не знаю
Цитата: biomotor от 23.06.21, 10:27:30с PhotoImage дела обстоят печально, не получается убрать border, и четко обозначить размер иконки.
если поставить на frame, то получается что frame подстраивается под размеры PhotoImage, хотя размеры четко заданы и большего размера.
а у меня смотрели как сделано в примере который я высылал?
Михаил88, у Вас иконки идут напрямую, я хочу сделать кнопку с иконкой и границей.
а можно увидеть как на выходе вы хотите чтобы получилось? А так сложно что то понять.
Михаил88, frame с границей и размерами, по центру иконка которая растягивается на максимум, если не указать ipadx или ipady
Screenshot_1.jpg
label имеет размеры не в пикселях,
frame не имеет image,
button не позволяет использовать нормальный border.
у меня получилось сделать? Так должно было быть.
https://yadi.sk/d/GAXGKEwXdUL-IQ
Михаил88, нет не так(старое не рассматриваем).
Нужно создать кнопку у которой вкл/выкл border,
внутри иконка растягивающаяся на всю кнопку и расположенная всегда строго по центру.
возможность поставить ipadx и ipady, для изменения размера иконки.
отсутствие лишних border и прочих границ.
P.S. у меня почему-то вместо растягивания иконки по кнопке, кнопка сжимается до иконки...
Цитата: biomotor от 23.06.21, 14:43:21Нужно создать кнопку у которой вкл/выкл border,
что это значит, вы скиньте пример
кнопка это ваш класс кнопка или стандартная кнопка? Так очень сложно понять без кода, что вы делаете
Вариант 1: (не растягивается иконка)
EXIT = 'R0lGODlhEAAQAHAAACH5BAEAAAsALAAAAAAQABAAgwMDAwAAAEVFRUlJSQEBAUhISEREREdHR0NDQ0JCQkpKSgAAAAAAAAAAAAAAAAAAAARMEASxqr0jEDnvLYFmhJ13kMiSkJQloNYatm+YXnJgjLZX5TDfjxRICC28kOG4qBFbHmciB62cek2WBYStOCmK4OXLufmum4BZCCJEAAA7'
class IButton(Frame):
def __init__(self, master):
super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')
self.pi = PhotoImage(data=EXIT)
self.c = tk.Canvas(self, width=38, height=38, bg='lightblue', highlightthickness=0)
self.ci = self.c.create_image(19, 19, image=self.pi, state=tk.NORMAL)
self.c.place(anchor=tk.CENTER, relx=0.5, rely=0.5)
btn = IButton(root)
btn.pack()
Вариант 2: (сжимает frame до размеров иконки)
EXIT = 'R0lGODlhEAAQAHAAACH5BAEAAAsALAAAAAAQABAAgwMDAwAAAEVFRUlJSQEBAUhISEREREdHR0NDQ0JCQkpKSgAAAAAAAAAAAAAAAAAAAARMEASxqr0jEDnvLYFmhJ13kMiSkJQloNYatm+YXnJgjLZX5TDfjxRICC28kOG4qBFbHmciB62cek2WBYStOCmK4OXLufmum4BZCCJEAAA7'
class IButton(Frame):
def __init__(self, master):
super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')
self.pi = PhotoImage(data=self.data)
self.lb = tk.Label(self, image=self.pi, relief='flat', borderwidth=0)
self.lb.place(anchor=tk.CENTER, x=20-1, y=20-1, width=38, height=38)
self.pack()
btn = IButton(root)
btn.pack()
from tkinter import *
import tkinter as tk
EXIT = 'R0lGODlhEAAQAHAAACH5BAEAAAsALAAAAAAQABAAgwMDAwAAAEVFRUlJSQEBAUhISEREREdHR0NDQ0JCQkpKSgAAAAAAAAAAAAAAAAAAAARMEASxqr0jEDnvLYFmhJ13kMiSkJQloNYatm+YXnJgjLZX5TDfjxRICC28kOG4qBFbHmciB62cek2WBYStOCmK4OXLufmum4BZCCJEAAA7'
class IButton(Frame):
def __init__(self, master):
super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')
self.pi = PhotoImage(data=EXIT)
self.c = tk.Canvas(self, width=38, height=38, bg='lightblue', highlightthickness=0)
self.ci = self.c.create_image(19, 19, image=self.pi, state=tk.NORMAL)
self.c.place(anchor=tk.CENTER, relx=0.5, rely=0.5)
root = Tk()
btn = IButton(root)
btn.pack(fill=tk.BOTH, expand=1)
root.mainloop()
Михаил88, не то, мне нужно чтобы иконка полностью заполняла frame, в моем случае class IButton(Frame):
from tkinter import *
import tkinter as tk
from PIL import Image, ImageTk
import io
import base64
EXIT = 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAG9QTFRFAAAApKSkdnZ2iYmJjIyMd3d3ODg4Ojo6kpKSPDw8iIiISEhINDQ0jY2Nj4+PNTU1Ozs7MjIySUlJMzMzlJSUmZmZmJiYi4uLk5OTPj4+PT09MTExPz8/m5ublpaWjo6OMDAwl5eXkZGRioqKhoaGNNjFLgAAACV0Uk5TAP///////////////////////////////////////////////6idEXsAAACQSURBVHicpZDbFoIgEEUBA+Qi5KCGVGiX///GMhGtHj0v7LXXGjgDQruDSbHggeBElPFyplIwmqTkSlcTGKuOecjU4BqEGv05lsi3bTsH7rR9yzvoA5z9d4MuAFyuP7Xa/l9GCyKAjVs3aBjjzYEuVuct1Pe5ksm7CeUeE1RacZkkYXxII+uamD7z5flDduQFuUsHRd9ZElkAAAAASUVORK5CYII='
class IButton(Frame):
def __init__(self, master):
super().__init__(master, width=40, height=40, bg='lightblue', highlightthickness=1, highlightbackground='#666666')
self.image = Image.open(io.BytesIO(base64.b64decode(EXIT)))
self.img_copy = self.image.copy()
self.pi = ImageTk.PhotoImage(self.image)
self.lb = tk.Label(self, image=self.pi, relief='flat', bg='lightblue', borderwidth=0)
self.lb.pack(fill=tk.BOTH, expand=1)
self.lb.bind('<Configure>', self._resize_image)
self.pack(fill=tk.BOTH, expand=1) #, padx=3, pady=3 (если нужны границы)
def _resize_image(self, event):
new_width = event.width
new_height = event.height
self.image = self.img_copy.resize((new_width, new_height))
self.pi = ImageTk.PhotoImage(self.image)
self.lb.configure(image=self.pi)
root = Tk()
root.geometry("200x200")
btn = IButton(root)
btn.pack()
root.mainloop()
Михаил88, практически то что нужно, единственное бы средствами tkinter...
а есть встроенные средства resize? или написать что-нить простенькое?
можно конечно использовать subsample и zoom, но иконка не сглаживается тогда...
может и можно, но я не искал.
Цитата: biomotor от 24.06.21, 08:13:39единственное бы средствами tkinter...
Почему только средствами tkinter хотите?
Михаил88, как минимум потому что почти у всех пользователей компаса нет сторонних библиотек, и там не поставишь их...
почему exe не использовать? Я пишу программы, всем передаю exe.
Михаил88, я не уверен что компиляция будет нормально проходить.
да и не очень хочется в файл накидывать кучу модулей, потом программа виснуть будет.
у меня на первом этапе после компиляции программа подвисает при запуске...
(чем больше модулей, тем больше будет весить exe.) один только python dll сколько весит...
вы попробуйте pyinstaller 4.2 (сами разработчики рекомендуют его как стабильно работающий)
Михаил88, а Вы 4.3 пробовали? не знаете он лучше, хуже или так же?
не пробовал
biomotor, более простое решение с разработкой библиотеки.
https://yadi.sk/d/tPd8ei7E4eA14A
Screenshot_1.png
заменить на путь до своей библиотеки
здесь и структура и предпросмотр все в одном и все делается встроенными функциями.
порядок действий:
1. Меняем на путь расположения своей библиотеки.
2. Выделяем в сборке нужные детали.
3. Запускаем программу.
4. В открывшемся окне выбираем нужную деталь. Подтверждаем выбор.
5. Происходит замена.
Остается сделать интерфейс. Например combobox(для выбора библиотеки если она не одна) ну и кнопку добавить для выполнения функции замены.
Михаил88, на счет combobox я уже думал об этом вопроссе...
а чем более простое решение с разработкой библиотеки отличается от моего?
вы пробовали запустить файл тот, что я скинул?
да, ничего не происходит, может я не помнимаю как с этим работать?
видимо да, вы путь к библиотеке на свой путь поменяли?
Screenshot_1.png
выделяю детали , запускаю файл с программой
выходит такое окно, выбираю на что поменять
нажимаю выбрать
происходит замена
Вот это окно и есть та самая библиотека , путь к которой прописан в коде.
а, путь не поменял....
ну а файл менять только вызовом ГЛАВНОГО окна с последующим выбором файла.
(PATH - путь до каталога Libs, поиск файлов по пути и выбор, жмешь ок, вылетает текущее окно.)
идеальное решение наверное...
в принципе, я пользуюсь только одной своей библиотектой, для меня такого решения будет вполне достаточно. (по поводу всего кода)
да, и еще, если объект/объекты не выбраны, то добавить объект.
Михаил88, можете добавить функцию добавления элемента?
Какие еще полезные программы пишете, если не секрет конечно... ?
biomotor, добавление элемента в сборку или в саму библиотеку? Можете описать, что эта функция должна делать.
Да всякие программки по автоматизации рутинной работы конструктора.
1) Есть готовая открытая сборка, если я не выделяю компонент в сборке, и нажимаю в выборе компонента библиотеки ОК, происходит не замена, а добавление выделенного компонента библиотеки как компонента сборки с выбором места установки.
2) Например? может и мне пригодится, может себе что другое замучу...
сделать можно, но вот зачем? Можно же вставить элемент из библиотеки стандартным методом.
Михаил88, а зачем мыкаться туда сюда, когда можно пользоваться одним инструментом?
резюме по скорости запуска:
py файл - 3 сек
pyw файл - 2 сек
exe файл - 10 сек
Вероятно из-за распаковки dll файлов из exe...
Цитата: biomotor от 23.06.21, 10:27:30Михаил88, есть ли аналог https://base64.guru/converter/encode/image/gif (https://base64.guru/converter/encode/image/gif)
только для BitmapImage?
в документации написано, что нужно сохранить картинку как .xbm. Далее в data прописываем этот файл (data='imag.xbm').
Второй способ открываем файл xbm текстовым редактором и копируем содержимое. Далее этот текст записываем в переменную и в записываем переменную
Цитата: biomotor от 25.06.21, 12:07:09Михаил88, а зачем мыкаться туда сюда, когда можно пользоваться одним инструментом?
Я как раз у себя в программе это и реализовал. Только у меня программа вставляет детали из папки с файлами, а не из библиотеки kle. Теперь думаю надо переписать, чтобы детали брались из библиотеки kle. Преимущества kle очевидны. Еще хотел сделать, чтобы вставка деталей в сборку была сразу с возможность установки сопряжений (аналогично вставке деталей из библиотеки стандартные изделия) вообще ради этого все и затевалось.
Михаил88, а Вы не пробовали установить pip в компасовский python?
Для чего вообще нужен питон в компасе? для стороннего подключения пользователей или для внутренних команд самого компаса?
Может вообще только для компас макро?
в пятницу попробовал, не получилось выдал ошибку.
Наверное для компас макро. Можете попробовать, при установке компаса отключить установку компас макро. И посмотреть после python установится или нет.
Михаил88, походу так оно и есть... только для компас макро.
Установил без компас макро, питона не появилось.
Удалил все из папки: C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\
Установил последний python по пути: C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\App\
Установил последний PyScripter по пути: C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\App\
Заменил Приложения -> конфигуратор -> утилиты->
Имя:
PyScripter-Portable.exe
на PyScripter
Путь
C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\PyScripter-Portable.exe
на C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\App\PyScripter.exe
Умка, какие скрипты, можете поделиться?
Михаил88, можете поделиться кодом для добавления компонента, под Ваш последний код?
(P.S. очень не хочется использовать костыли когда есть готовое практически идеальное решение...)
https://yadi.sk/d/dzUpwqCGH_3zMw
сначала запустить dispatchOCX.py (делается разово)
потом уже пользуемся Библиотека.pyw (в коде заменить на путь до своей библиотеки)
в имени директории расположения папки library не должно быть кириллицы
хорошо бы кто ни будь поделился кодом на наложение сопряжений (совпадение , соосность) при вставке детали из библиотеки
Михаил88, было бы неплохо, но только вот наверняка сопряжения наложить можно но в фоновом режиме, а в режиме редактирования наверное никак...
Можно. На этапе добавления детали в сборку, также как вставляете детали из библиотеки стандартных изделий.
Михаил88, в какой программе пишете код на python?
PyCharm
Михаил88, PyScripter не используете? пробовали? отзыв?
biomotor, PyScripter тоже использовал. Для мох задач его вполне хватало. Потом решил попробовать PyCharm (уже не помню из-за чего) так и остался на нем.
Михаил88, не видали на PyScrypter тему типа как в PyCharm - Darcula?
нет не видел
Михаил88, вот сделал сам, если кому-то нужно будет, тема и стиль Darcula на PyScrypter. Скачать. (https://ru.stackoverflow.com/questions/1300064/darcula-%d1%81%d0%ba%d0%b8%d0%bd-%d0%b8-%d1%81%d1%85%d0%b5%d0%bc%d1%8b-%d0%b4%d0%bb%d1%8f-pyscripter/1300066#1300066)