我正在尝试创建一个类似 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。