第一次提交
This commit is contained in:
		
							parent
							
								
									1145dbfe49
								
							
						
					
					
						commit
						f868be562f
					
				@ -177,7 +177,8 @@ class CanvasWidget(tk.Canvas):
 | 
			
		||||
 | 
			
		||||
        # 绘制背景图(如果有)
 | 
			
		||||
        if self.project.template.bg_image:
 | 
			
		||||
            bg_key = id(self.project.template.bg_image)
 | 
			
		||||
            # 使用更稳定的缓存键,包含图像的标识和尺寸
 | 
			
		||||
            bg_key = (id(self.project.template.bg_image), template_w, template_h, self.zoom)
 | 
			
		||||
            if bg_key not in self.image_cache or self.image_cache[bg_key][0] != self.zoom:
 | 
			
		||||
                # 缩放背景图并缓存
 | 
			
		||||
                scaled_bg = self.project.template.bg_image.resize(
 | 
			
		||||
 | 
			
		||||
@ -264,19 +264,35 @@ class MainWindow(tk.Tk):
 | 
			
		||||
        """设置模板"""
 | 
			
		||||
        dialog = TemplateDialog(self, self.project.template)
 | 
			
		||||
        if dialog.result:
 | 
			
		||||
            if dialog.result["type"] == "preset":
 | 
			
		||||
            if dialog.result["type"] == "preset_loaded":
 | 
			
		||||
                # 直接使用已加载的模板设置,不需要重新创建Template对象
 | 
			
		||||
                # 模板已经在对话框中加载完成,只需确保画布刷新
 | 
			
		||||
                pass
 | 
			
		||||
            elif dialog.result["type"] == "preset":
 | 
			
		||||
                # 确保传递所有参数并创建模板
 | 
			
		||||
                self.project.template = Template(
 | 
			
		||||
                    dialog.result["ratio"],
 | 
			
		||||
                    dialog.result["width"]
 | 
			
		||||
                    ratio=tuple(dialog.result["ratio"]),
 | 
			
		||||
                    width_px=dialog.result["width"],
 | 
			
		||||
                    height_px=dialog.result.get("height")
 | 
			
		||||
                )
 | 
			
		||||
                # 设置背景颜色
 | 
			
		||||
                self.project.template.bg_color = dialog.result["bg_color"]
 | 
			
		||||
                # 设置背景图
 | 
			
		||||
                if "bg_image" in dialog.result:
 | 
			
		||||
                    self.project.template.bg_image = dialog.result["bg_image"]
 | 
			
		||||
            else:
 | 
			
		||||
                self.project.template = Template()
 | 
			
		||||
                self.project.template.set_custom_size(
 | 
			
		||||
                    dialog.result["width"],
 | 
			
		||||
                    dialog.result["height"]
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
                # 设置背景颜色
 | 
			
		||||
                self.project.template.bg_color = dialog.result["bg_color"]
 | 
			
		||||
                # 设置背景图
 | 
			
		||||
                if "bg_image" in dialog.result:
 | 
			
		||||
                    self.project.template.bg_image = dialog.result["bg_image"]
 | 
			
		||||
 | 
			
		||||
            # 确保更新画布显示
 | 
			
		||||
            self.canvas.draw_preview()
 | 
			
		||||
 | 
			
		||||
    def batch_export(self):
 | 
			
		||||
 | 
			
		||||
@ -119,9 +119,13 @@ class ForegroundImage:
 | 
			
		||||
class Template:
 | 
			
		||||
    """模板对象,存储尺寸和背景信息"""
 | 
			
		||||
 | 
			
		||||
    def __init__(self, ratio=(16, 9), width_px=1200):
 | 
			
		||||
    def __init__(self, ratio=(16, 9), width_px=1200, height_px=None):
 | 
			
		||||
        self.ratio = ratio
 | 
			
		||||
        self.width_px = width_px
 | 
			
		||||
        # 如果提供了高度,使用提供的高度,否则根据比例计算
 | 
			
		||||
        if height_px is not None:
 | 
			
		||||
            self.height_px = height_px
 | 
			
		||||
        else:
 | 
			
		||||
            self.height_px = int(width_px * ratio[1] / ratio[0])
 | 
			
		||||
        self.bg_image = None
 | 
			
		||||
        self.bg_color = "#FFFFFF"  # 默认白色背景
 | 
			
		||||
@ -159,8 +163,7 @@ class Template:
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def from_dict(cls, data):
 | 
			
		||||
        """从字典创建对象"""
 | 
			
		||||
        template = cls(data["ratio"], data["width_px"])
 | 
			
		||||
        template.height_px = data["height_px"]
 | 
			
		||||
        template = cls(data["ratio"], data["width_px"], data["height_px"])
 | 
			
		||||
        template.bg_color = data.get("bg_color", "#FFFFFF")
 | 
			
		||||
        return template
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -110,6 +110,8 @@ class TemplateDialog(tk.Toplevel):
 | 
			
		||||
            messagebox.showwarning("警告", "请先选择一个预设")
 | 
			
		||||
            return
 | 
			
		||||
            
 | 
			
		||||
        # 设置标志以避免在刷新界面时更改尺寸
 | 
			
		||||
        self._loading_preset = True
 | 
			
		||||
        if self.preset_manager.load_preset_to_template(selected_preset, self.current_template):
 | 
			
		||||
            # 更新界面显示
 | 
			
		||||
            self.refresh_from_template()
 | 
			
		||||
@ -118,6 +120,8 @@ class TemplateDialog(tk.Toplevel):
 | 
			
		||||
            messagebox.showinfo("成功", f"已加载预设: {selected_preset}")
 | 
			
		||||
        else:
 | 
			
		||||
            messagebox.showerror("错误", "加载预设失败")
 | 
			
		||||
        # 清除标志
 | 
			
		||||
        self._loading_preset = False
 | 
			
		||||
 | 
			
		||||
    def save_current_as_preset(self):
 | 
			
		||||
        """将当前设置保存为预设"""
 | 
			
		||||
@ -177,6 +181,9 @@ class TemplateDialog(tk.Toplevel):
 | 
			
		||||
            self.show_custom_frame()
 | 
			
		||||
        else:
 | 
			
		||||
            self.hide_custom_frame()
 | 
			
		||||
            # 仅在非预设加载情况下设置默认尺寸
 | 
			
		||||
            # 当从预设加载时,保持预设的尺寸不变
 | 
			
		||||
            if not (hasattr(self, '_loading_preset') and self._loading_preset):
 | 
			
		||||
                # 设置默认尺寸
 | 
			
		||||
                w, h = map(int, self.ratio_var.get().split(":"))
 | 
			
		||||
                self.width_var.set(1920 if w > h else 1080)
 | 
			
		||||
@ -201,6 +208,8 @@ class TemplateDialog(tk.Toplevel):
 | 
			
		||||
        if file_path:
 | 
			
		||||
            if self.current_template.load_background(file_path):
 | 
			
		||||
                self.bg_image_var.set("已设置")
 | 
			
		||||
                # 立即刷新画布预览
 | 
			
		||||
                self.parent.get_canvas().draw_preview()
 | 
			
		||||
 | 
			
		||||
    def clear_bg_image(self):
 | 
			
		||||
        """清除背景图"""
 | 
			
		||||
@ -212,7 +221,21 @@ class TemplateDialog(tk.Toplevel):
 | 
			
		||||
        # 如果选择了预设,则应用预设
 | 
			
		||||
        selected_preset = self.preset_var.get()
 | 
			
		||||
        if selected_preset:
 | 
			
		||||
            if not self.preset_manager.load_preset_to_template(selected_preset, self.current_template):
 | 
			
		||||
            if self.preset_manager.load_preset_to_template(selected_preset, self.current_template):
 | 
			
		||||
                # 刷新主窗口画布
 | 
			
		||||
                self.parent.get_canvas().draw_preview()
 | 
			
		||||
                # 设置返回结果,包含预设的所有信息
 | 
			
		||||
                self.result = {
 | 
			
		||||
                    "type": "preset_loaded",  # 修改类型以区分预设选择和预设加载
 | 
			
		||||
                    "ratio": self.current_template.ratio,
 | 
			
		||||
                    "width": self.current_template.width_px,
 | 
			
		||||
                    "height": self.current_template.height_px,
 | 
			
		||||
                    "bg_color": self.current_template.bg_color,
 | 
			
		||||
                    "bg_image": self.current_template.bg_image
 | 
			
		||||
                }
 | 
			
		||||
                self.destroy()
 | 
			
		||||
                return
 | 
			
		||||
            else:
 | 
			
		||||
                messagebox.showerror("错误", "加载预设失败")
 | 
			
		||||
                return
 | 
			
		||||
        
 | 
			
		||||
@ -227,15 +250,18 @@ class TemplateDialog(tk.Toplevel):
 | 
			
		||||
                    "type": "custom",
 | 
			
		||||
                    "width": width,
 | 
			
		||||
                    "height": height,
 | 
			
		||||
                    "bg_color": self.bg_color_var.get()
 | 
			
		||||
                    "bg_color": self.bg_color_var.get(),
 | 
			
		||||
                    "bg_image": self.current_template.bg_image
 | 
			
		||||
                }
 | 
			
		||||
            else:
 | 
			
		||||
                w, h = map(int, self.ratio_var.get().split(":"))
 | 
			
		||||
                self.result = {
 | 
			
		||||
                    "type": "preset",
 | 
			
		||||
                    "ratio": (w, h),
 | 
			
		||||
                    "ratio": tuple([w, h]),
 | 
			
		||||
                    "width": self.width_var.get(),
 | 
			
		||||
                    "bg_color": self.bg_color_var.get()
 | 
			
		||||
                    "height": self.height_var.get(),
 | 
			
		||||
                    "bg_color": self.bg_color_var.get(),
 | 
			
		||||
                    "bg_image": self.current_template.bg_image
 | 
			
		||||
                }
 | 
			
		||||
            self.destroy()
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
@ -250,5 +276,23 @@ class TemplateDialog(tk.Toplevel):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user