基于 Python 的 MS 画图应用程序 - 无法保存图片

问题描述 投票:0回答:0

我正在尝试创建一个类似 Paint 的基于 Python 的应用程序。我曾尝试实现一个保存功能,但它似乎只保存背景/墙纸而不是绘图本身。任何解决此问题的帮助将不胜感激。我在 MacOS 13.3.1 上使用 PyCharm CE。这是我到目前为止所做的:

import tkinter as tk
from tkinter import messagebox
from tkinter import filedialog
from tkinter import colorchooser
from PIL import Image
from PIL import ImageGrab
class PaintApp:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Paint App")
        # Get the screen resolution
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()

        # Set the size of the main window
        width = int(screen_width * 1.0)
        height = int(screen_height * 1.0)
        self.root.geometry(f"{width}x{height}")

        self.canvas = tk.Canvas(self.root, bg="white")
        self.canvas.pack(fill="both", expand=True)
        self.brush_color = 'black'
        self.brush_size = 2
        self.canvas.bind('<B1-Motion>', self.draw)

        self.color_selector = tk.Frame(self.root, pady=10)
        self.color_selector.pack()

        self.color_label = tk.Label(self.color_selector, text='Brush Colour')
        self.color_label.pack(side='left', padx=5)

        self.red_button = tk.Button(self.color_selector, bg='red', width=2, command=lambda:self.set_brush_color('red'), highlightbackground='red')
        self.red_button.pack(side='left', padx=5)
        self.green_button = tk.Button(self.color_selector, bg='green', width=2, command=lambda:self.set_brush_color('green'), highlightbackground='green')
        self.green_button.pack(side='left', padx=5)
        self.blue_button = tk.Button(self.color_selector, bg='blue', width=2, command=lambda:self.set_brush_color('blue'), highlightbackground='blue')
        self.blue_button.pack(side='left', padx=5)
        self.yellow_button = tk.Button(self.color_selector, bg='yellow', width=2, command=lambda: self.set_brush_color('yellow'), highlightbackground='yellow')
        self.yellow_button.pack(side='left', padx=5)
        self.orange_button = tk.Button(self.color_selector, bg='orange', width=2, command=lambda: self.set_brush_color('orange'), highlightbackground='orange')
        self.orange_button.pack(side='left', padx=5)

        self.size_selector = tk.Frame(self.root, pady=10)
        self.size_selector.pack()
        self.color_label = tk.Label(self.size_selector, text='Brush Size')
        self.color_label.pack(side='left', padx=5)
        self.small_button = tk.Button(self.size_selector, text='Small', width=8, command=lambda:self.set_brush_size(2), highlightbackground= 'white')
        self.small_button.pack(side='left', padx=5)
        self.medium_button = tk.Button(self.size_selector, text='Medium', width=8, command=lambda:self.set_brush_size(5), highlightbackground='white')
        self.medium_button.pack(side='left', padx=5)
        self.large_button = tk.Button(self.size_selector, text='Large', width=8, command=lambda:self.set_brush_size(10), highlightbackground='white')
        self.large_button.pack(side='left', padx=5)

        self.eraser_button = tk.Button(self.root, text='Eraser', width=10, command=self.set_brush_to_white)
        self.eraser_button.pack(side='right', padx=10, pady=10)

        self.save_button = tk.Button(self.root, text='Save', width=8, command=self.save_drawing, relief='solid')
        self.save_button.pack(side='right', padx=10, pady=10)

    def save_drawing(self):
        file_path = filedialog.asksaveasfilename(defaultextension='.png')
        if file_path:
            x = self.root.winfo_rootx() + self.canvas.winfo_x()
            y = self.root.winfo_rooty() + self.canvas.winfo_y()
            x1 = x + self.canvas.winfo_width()
            y1 = y + self.canvas.winfo_height()
            img = ImageGrab.grab().crop((x, y, x1, y1))
            img.save(file_path)

    def draw(self, event):
        x1, y1 = (event.x - self.brush_size), (event.y - self.brush_size)
        x2, y2 = (event.x + self.brush_size), (event.y + self.brush_size)
        self.canvas.create_oval(x1, y1, x2, y2, fill=self.brush_color, outline=self.brush_color)

    def set_brush_color(self, color):
        self.brush_color = color

    def set_brush_size(self, size):
        self.brush_size = size
        self.small_button['relief'] = 'raised'
        self.medium_button['relief'] = 'raised'
        self.large_button['relief'] = 'raised'
        if size == 2:
            self.small_button['relief'] = 'sunken'
        elif size == 5:
            self.medium_button['relief'] = 'sunken'
        elif size == 10:
            self.large_button['relief'] = 'sunken'

    def set_brush_to_white(self):
        self.brush_color = 'white'

    def run(self):
        self.root.mainloop()

if __name__ == '__main__':
    app = PaintApp()
    app.run()

我尝试保存,但输出文件只显示屏幕壁纸,就好像应用程序/绘图是不可见的。我尝试使用 postscript,但它似乎不适用于 MacOS。

python macos tkinter paint
© www.soinside.com 2019 - 2024. All rights reserved.