#java #python #tkinter #tkinter-canvas
#java #python #tkinter #tkinter-холст
Вопрос:
Я делаю проект на Python, в котором пользователь может писать и рисовать на холсте, фоном которого является изображение страницы блокнота. я хочу, чтобы пользователь мог стереть рисунок на холсте движением мыши. Я пытался использовать create_line, где он рисует белым цветом, но это работает, только если фон белый, но для моего фона это просто выглядит так, как будто фон также стирается.
def paint(self, event):
self.line_width = self.choose_size_button.get()
paint_color = self.color
if self.old_x and self.old_y:
self.c.create_line(self.old_x, self.old_y, event.x, event.y,
width=self.line_width, fill=paint_color,
capstyle=ROUND, smooth=TRUE,splinesteps=36,tags='rub')
if self.eraser_on :
self.c.delete(id(self.c.create_line))
self.old_x = event.x
self.old_y = event.y
def reset(self, event):
self.old_x, self.old_y = None, None
Я также использовал event.y событие.y в холсте.удалить (event.x,event.y), но это также не работает
Комментарии:
1. Раньше я использовал прозрачный холст и фоновое изображение.
2. Это «.c.delete(id(self.c.create_line))» не имеет смысла. Зачем использовать
id
функцию.create_line
для удаления элемента наCanvas
?3. @StefvanderZon Как вы использовали фоновое изображение?…. Я использовал photo = PhotoImage (file = ‘image’), и я все еще не могу понять, как стереть элементы с холста…… На самом деле я новичок в tkinter и python
4. @AbhishekGhanekar Поверхности pygame можно рассматривать как слои. Все остается на экране, пока на нем не будет нарисовано что-то еще. Это означает, что способ стереть что-либо — это нарисовать что-то поверх этого. Я создал простое приложение для рисования, чтобы объяснить вам, что я сказал ранее.
Ответ №1:
Вы не можете стереть холст так, как хотите. Холст не является инструментом рисования на основе пикселей. Вы можете добавлять и удалять объекты, но вы не можете закрасить или стереть только части объекта.
Ответ №2:
Я написал небольшую программу для вас, чтобы показать, что я исправил ранее в комментариях. Надеюсь, это поможет.
Вам нужен файл test.png размером 640×480 в той же папке, что и программа, и вы можете запустить этот код. Это всего лишь простое приложение для рисования.
Холст — это поверхность для рисования, экранный объект — это фон.
import pygame as pg
from pygame import Color, Surface
WIDTH = 640
HEIGHT = 480
EMPTY = Color(0,0,0,0)
screen = pg.display.set_mode((WIDTH, HEIGHT))
pg.display.set_caption("Drawing app")
bg = pg.image.load("test.png")
clock = pg.time.Clock()
#I create a transparant canvas
canvas = pg.Surface([640,480], pg.SRCALPHA, 32)
def main():
is_running = True
while is_running:
for event in pg.event.get():
if event.type == pg.QUIT:
is_running = False
elif event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
is_running = False
elif event.type == pg.MOUSEMOTION:
if pg.mouse.get_pressed()[0]:
#if mouse 1 is pressed, you draw a circle on the location of the cursor
location = (pg.mouse.get_pos())
pg.draw.circle(canvas, (0,0,0), location, 20)
elif event.type == pg.MOUSEBUTTONDOWN:
#clear canvas on mouse button 3 press
if event.button == 3:
canvas.fill(EMPTY)
#I blit the background first!
screen.blit(bg,(0,0))
#afterwards I overwrite it with a transparant canvas with the drawing I want
screen.blit(canvas,(0,0))
pg.display.update()
clock.tick(200)
if __name__ == "__main__":
main()