吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 534|回复: 22
上一主题 下一主题
收起左侧

[Python 原创] 我用python写了一个图文编辑器

[复制链接]
跳转到指定楼层
楼主
yecaxi 发表于 2024-11-14 10:44 回帖奖励
本帖最后由 yecaxi 于 2024-11-14 10:51 编辑

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

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

[Asm] 纯文本查看 复制代码
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] <= 0 or img.size[1] <= 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[0]
            font_size = header_font[1]
            
            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[3] - text_bbox[1]
                            
                            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[2] - text_bbox[0]
                            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[3] - bbox[1]
                            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[3] - bbox[1]
                        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[0]
                font_size = title_font[1]
                
                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}")

免费评分

参与人数 2吾爱币 +7 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
machuhai + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
a6814291 发表于 2024-11-14 16:03
谢谢分享,我是一个python小白,我尝试运行了代码,第13行出现错误,提示未引用'utils'文件,我尝试将'utils'当作库处理,使用pip install utils安装,并没有解决,求助大神我应该怎样处理
如果新建一个文件'utils.py'处理的话,所引用的两个自定义函数safe_get_int, safe_get_float应该怎么写?
对于编程没有基础,自学摸索了一些,对很多问题还一知半解,请教一下,非常感谢
推荐
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
3#
c2042432 发表于 2024-11-14 13:05
1111好东西
4#
田馥甄 发表于 2024-11-14 13:15
使用场景是?海报制作吗还是
5#
Yahoo0222 发表于 2024-11-14 13:34
python小白前来学习
6#
jackiecn111 发表于 2024-11-14 14:10
学习学习,赞了
7#
cgkmh 发表于 2024-11-14 14:20
正在学习python的kivy,感谢分享,kivy打包真的是太坑了。
8#
aosikaiii 发表于 2024-11-14 14:23
好东西,点赞
9#
rsword1981 发表于 2024-11-14 14:28
谢谢分享
10#
heixie 发表于 2024-11-14 14:34
学习了,谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 09:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表