我用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}") 谢谢分享,我是一个python小白,我尝试运行了代码,第13行出现错误,提示未引用'utils'文件,我尝试将'utils'当作库处理,使用pip install utils安装,并没有解决,求助大神我应该怎样处理{:1_919:}
如果新建一个文件'utils.py'处理的话,所引用的两个自定义函数safe_get_int, safe_get_float应该怎么写?
对于编程没有基础,自学摸索了一些,对很多问题还一知半解,请教一下,非常感谢{:1_893:}{:1_893:} 运行后出现 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),请教大神解决方案 好东西,收藏了,赞一个!{:1_921:} 1111好东西
使用场景是?海报制作吗还是 python小白前来学习 学习学习,赞了 正在学习python的kivy,感谢分享,kivy打包真的是太坑了。 好东西,点赞 谢谢分享 学习了,谢谢