yecaxi 发表于 2024-11-14 10:44

我用python写了一个图文编辑器

本帖最后由 yecaxi 于 2024-11-14 10:51 编辑

小弟不才,写了个工具,方便不懂PS的朋友使用,有什么好的建议,发出来我来实现,


[*]顶部标题设置
多行标题文本编辑
自定义字体选择(支持.ttf/.otf 格式)
字号大小调整
标题颜色选择(带实时预览)
标题上下间距调整
[*]段落管理
添加段落
删除段落
拖拽排序(通过☰图标)
自动保存功能
[*]段落标题设置
标题文本输入
自定义字体选择
字号设置
颜色选择(带预览)
标题下间距设置
对齐方式(左对齐、居中、右对齐)
[*]段落内容设置
多行文本编辑
自定义字体选择
字号设置
文本颜色选择
行距调整
段落间距设置
对齐方式(左对齐、居中、右对齐)
右键菜单(剪切、复制、粘贴、全选)
[*]背景设置
上传背景图片
自动调整图片大小和位置
[*]预览功能
实时预览效果
所有设置即时更新
模拟最终显示效果
[*]导出功能
导出为图片(JPG 格式)
保持原始布局和样式
[*]数据管理
自动保存(每 30 秒)
加载上次编辑内容
保存所有设置(包括字体、颜色、间距等)
[*]字体管理
支持自定义字体(.ttf 和.otf 格式)
字体搜索功能
字体实时预览
字体选择确认 / 取消
[*]界面特性
可滚动的编辑区域
固定大小的预览区域
清晰的分区布局
友好的用户界面
文章美化设计
内容展示优化
技术特点
实时渲染预览
稳定的性能表现
精确的排版控制
灵活的自定义选项
链接:https://pan.baidu.com/s/1ZxtPbWv3Aw5E-V4_MWyy6g 提取码:wb5m

import tkinter as tk
from tkinter import ttk
try:
    from PIL import Image, ImageTk, ImageDraw, ImageFont
except ImportError:
    try:
      import Image, ImageTk, ImageDraw, ImageFont
    except ImportError:
      raise

from tkinter import filedialog, messagebox
from utils import safe_get_int, safe_get_float
import os

class PreviewManager:
    def __init__(self, editor):
      self.editor = editor
      self.create_preview_area()
   
    def create_preview_area(self):
      self.preview_canvas = tk.Canvas(
            self.editor.preview_container,
            borderwidth=0,
            relief="flat",
            bg="#f0f0f0",
            highlightthickness=0,
            width=600,
            height=800
      )
      self.preview_canvas.pack(fill=tk.BOTH, expand=True)
      
      shadow_color = '#d0d0d0'
      self.editor.preview_container.configure(style='Preview.TFrame')
      style = ttk.Style()
      style.configure('Preview.TFrame',
                     background=shadow_color,
                     relief='solid',
                     borderwidth=1)
      
      self.preview_content = tk.Frame(
            self.preview_canvas,
            bg="white"
      )
      self.preview_canvas.create_window(
            (0, 0),
            window=self.preview_content,
            anchor="nw",
            width=600,
            height=800
      )
      
      self.preview_canvas.bind('<Configure>', self._on_canvas_configure)
   
    def upload_background(self):
      file_path = filedialog.askopenfilename(
            filetypes=[
                ("图片文件", "*.png *.jpg *.jpeg *.gif *.bmp")
            ]
      )
      if file_path:
            try:
                with Image.open(file_path) as img:
                  if img.size <= 0 or img.size <= 0:
                        raise ValueError("Invalid image dimensions")
               
                self.editor.background_image_path = file_path
                self.update_preview()
               
            except Exception as e:
                print(f"图片载错误: {e}")
                messagebox.showerror("错误", "无法加载的图片,请选择其他图片。")
   
    def update_preview(self):
      self.preview_canvas.delete("all")
      
      if self.editor.background_image_path:
            try:
                original_image = Image.open(self.editor.background_image_path)
               
                canvas_width = 600
                canvas_height = 800
               
                width_ratio = canvas_width / original_image.width
                height_ratio = canvas_height / original_image.height
                scale_ratio = min(width_ratio, height_ratio)
               
                new_width = int(original_image.width * scale_ratio)
                new_height = int(original_image.height * scale_ratio)
               
                x_offset = (canvas_width - new_width) // 2
                y_offset = (canvas_height - new_height) // 2
               
                resized_image = original_image.resize(
                  (new_width, new_height),
                  Image.Resampling.LANCZOS
                )
                self.background_photo = ImageTk.PhotoImage(resized_image)
               
                self.preview_canvas.create_image(
                  x_offset, y_offset,
                  image=self.background_photo,
                  anchor="nw",
                  tags="background_image"
                )
               
            except Exception as e:
                print(f"加载图片错误: {e}")
                messagebox.showerror("错误", f"加载图片时出错: {e}")
      
      header_text = self.editor.header_manager.header_text.get("1.0", tk.END).strip()
      if header_text:
            x = 300
            y = safe_get_int(self.editor.header_manager.header_line_spacing, 20)
            
            header_font = self.editor.header_manager.header_font
            font_path = header_font
            font_size = header_font
            
            if isinstance(font_path, str) and font_path.lower().endswith(('.ttf', '.otf')):
                try:
                  custom_font = ImageFont.truetype(font_path, font_size)
                  
                  for line in header_text.split('\n'):
                        if line.strip():
                            temp_img = Image.new('RGBA', (1, 1), (0, 0, 0, 0))
                            temp_draw = ImageDraw.Draw(temp_img)
                            text_bbox = temp_draw.textbbox((0, 0), line, font=custom_font)
                            text_height = text_bbox - text_bbox
                           
                            padding = max(40, int(text_height * 0.2))
                            img = Image.new('RGBA', (600, text_height + padding * 2), (0, 0, 0, 0))
                            draw = ImageDraw.Draw(img)
                           
                            text_width = text_bbox - text_bbox
                            text_x = (600 - text_width) // 2
                           
                            draw.text((text_x, padding), line, font=custom_font, fill=self.editor.header_manager.header_color)
                           
                            text_photo = ImageTk.PhotoImage(img)
                            if not hasattr(self, 'text_photos'):
                              self.text_photos = []
                            self.text_photos.append(text_photo)
                           
                            self.preview_canvas.create_image(0, y, image=text_photo, anchor="nw")
                            y += text_height + padding
                           
                except Exception as e:
                  print(f"自定义字体加载错误: {e}")
                  for line in header_text.split('\n'):
                        if line.strip():
                            self.preview_canvas.create_text(
                              x, y,
                              text=line,
                              font=("Arial", font_size, "bold"),
                              fill=self.editor.header_manager.header_color,
                              anchor="n"
                            )
                            bbox = self.preview_canvas.bbox(self.preview_canvas.find_all()[-1])
                            text_height = bbox - bbox
                            y += text_height
            else:
                for line in header_text.split('\n'):
                  if line.strip():
                        self.preview_canvas.create_text(
                            x, y,
                            text=line,
                            font=header_font,
                            fill=self.editor.header_manager.header_color,
                            anchor="n"
                        )
                        bbox = self.preview_canvas.bbox(self.preview_canvas.find_all()[-1])
                        text_height = bbox - bbox
                        y += text_height
                           
            y_position = y + safe_get_int(self.editor.header_manager.header_spacing, 50)
      else:
            y_position = 20
      
      for section in self.editor.section_manager.sections:
            title_text = section['title'].get()
            if title_text:
                x = 300
               
                title_font = section['title_font']
                font_path = title_font
                font_size = title_font
               
                if isinstance(font_path, str) and font_path.lower().endswith(('.ttf', '.otf')):
                  try:
                        custom_font = ImageFont.truetype(font_path, font_size)
                        
                        # 创建临时图像(此处后续代码似乎未完整,原代码中此处应该还有后续操作,不过按照删除注释要求暂不考虑完整性问题)
                  except Exception as e:
                        print(f"自定义字体加载错误: {e}")

a6814291 发表于 2024-11-14 16:03

谢谢分享,我是一个python小白,我尝试运行了代码,第13行出现错误,提示未引用'utils'文件,我尝试将'utils'当作库处理,使用pip install utils安装,并没有解决,求助大神我应该怎样处理{:1_919:}
如果新建一个文件'utils.py'处理的话,所引用的两个自定义函数safe_get_int, safe_get_float应该怎么写?
对于编程没有基础,自学摸索了一些,对很多问题还一知半解,请教一下,非常感谢{:1_893:}{:1_893:}

yanxiaoguang 发表于 2024-11-14 17:27

运行后出现 from utils import safe_get_int, safe_get_float
ImportError: cannot import name 'safe_get_int' from 'utils' (D:\Anaconda\envs\pythonProject\Lib\site-packages\utils\__init__.py),请教大神解决方案

yuanwiuming 发表于 2024-11-14 13:03

好东西,收藏了,赞一个!{:1_921:}

c2042432 发表于 2024-11-14 13:05

1111好东西

田馥甄 发表于 2024-11-14 13:15

使用场景是?海报制作吗还是

Yahoo0222 发表于 2024-11-14 13:34

python小白前来学习

jackiecn111 发表于 2024-11-14 14:10

学习学习,赞了

cgkmh 发表于 2024-11-14 14:20

正在学习python的kivy,感谢分享,kivy打包真的是太坑了。

aosikaiii 发表于 2024-11-14 14:23

好东西,点赞

rsword1981 发表于 2024-11-14 14:28

谢谢分享

heixie 发表于 2024-11-14 14:34

学习了,谢谢
页: [1] 2 3
查看完整版本: 我用python写了一个图文编辑器