Today I tested the bpy python module from Blender 3D software version 3.5 and I made this lite addon that showed me a modal dialog and checked and installed the Pillow python module.
The script don't install Pillow because is not fixed.
The main reason was to add my Python tools and features to Blender 3D and share with you.
bl_info = {
"name": "Tools by catafest",
"blender": (3, 0, 0),
"category": "3D View",
}
import bpy
from bpy.types import Operator, Panel
from bpy.props import StringProperty
try:
import importlib
importlib.import_module("Pillow")
PIL_installed = True
except ImportError:
PIL_installed = False
def install_pillow():
import subprocess
try:
subprocess.run([bpy.app.binary_path, '--python-exit-code', '1', '-m', 'ensurepip'])
subprocess.check_call([bpy.app.binary_path, '-m', 'pip', 'install', 'Pillow'])
except subprocess.CalledProcessError as e:
print("Eroare la instalarea Pillow:", e)
# Operator pentru a afișa fereastra modală cu informații despre instalarea Pillow
class CATAFEST_IMAGES_OT_show_pillow_message(Operator):
bl_idname = "catafest.show_pillow_message"
bl_label = "Show Pillow Message"
def execute(self, context):
global PIL_installed
message = "Pillow este instalat." if PIL_installed else "Pillow nu este instalat."
# Dacă Pillow nu este instalat, încercați să-l instalați
if not PIL_installed:
install_pillow()
try:
import importlib
importlib.import_module("Pillow")
PIL_installed = True
message = "Pillow a fost instalat cu succes!" if PIL_installed else "Eroare la instalarea Pillow."
except ImportError:
PIL_installed = False
# Afișați fereastra modală în centrul ecranului
bpy.ops.catafest.show_modal_message('INVOKE_DEFAULT', title="Starea Pillow", message=message)
return {'FINISHED'}
def invoke(self, context, event):
return self.execute(context)
# Operator pentru a afișa fereastra modală personalizată
class CATAFEST_IMAGES_OT_show_modal_message(Operator):
bl_idname = "catafest.show_modal_message"
bl_label = "Show Modal Message"
title: bpy.props.StringProperty(default="Message")
message: bpy.props.StringProperty(default="")
def execute(self, context):
return {'FINISHED'}
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self, width=400)
def draw(self, context):
layout = self.layout
layout.label(text=self.message)
# Panel pentru bara laterală din 3D View
class VIEW3D_PT_tools_image(Panel):
bl_label = "Images"
bl_idname = "VIEW3D_PT_tools_image"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'Tools by catafest'
def draw(self, context):
layout = self.layout
layout.operator(CATAFEST_IMAGES_OT_show_modal_message.bl_idname)
layout.operator(CATAFEST_IMAGES_OT_show_pillow_message.bl_idname)
def register():
bpy.utils.register_class(CATAFEST_IMAGES_OT_show_modal_message)
bpy.utils.register_class(CATAFEST_IMAGES_OT_show_pillow_message)
bpy.utils.register_class(VIEW3D_PT_tools_image)
def unregister():
bpy.utils.unregister_class(CATAFEST_IMAGES_OT_show_modal_message)
bpy.utils.unregister_class(CATAFEST_IMAGES_OT_show_pillow_message)
bpy.utils.unregister_class(VIEW3D_PT_tools_image)
if __name__ == "__main__":
register()