from tkinter import *
from tkinter.colorchooser import askcolor
import sys
class Paint(object):
DEFAULT_PEN_SIZE = 5.0
DEFAULT_COLOR = 'black'
def __init__(self):
self.root = Tk()
self.pen_button = Button(self.root, text=u'pen', command=self.use_pen)
self.pen_button.grid(row=0, column=0)
self.brush_button = Button(self.root, text='brush', command=self.use_brush)
self.brush_button.grid(row=0, column=1)
self.color_button = Button(self.root, text='color', command=self.choose_color)
self.color_button.grid(row=0, column=2)
self.eraser_button = Button(self.root, text='eraser', command=self.use_eraser)
self.eraser_button.grid(row=0, column=3)
self.undo_button = Button(self.root, text='戻る', command=self.undo)
self.undo_button.grid(row=0, column=4)
self.redo_button = Button(self.root, text='進む', command=self.redo)
self.redo_button.grid(row=0, column=5)
self.choose_size_button = Scale(self.root, from_=1, to=1000, orient=HORIZONTAL)
self.choose_size_button.grid(row=0, column=6)
# 自作
self.size_box = Entry(width=20)
self.size_box.grid(row=0, column=7)
self.temp_size = 1
self.decide_size_button = Button(self.root, text="サイズ決定", command=self.decide_size)
self.decide_size_button.grid(row=0, column=8)
#
self.c = Canvas(self.root, bg='white', width=1400, height=800)
#self.draw_zone = Canvas(self.root, bg='white', width=1400, height=800)
self.c.grid(row=1, columnspan=4)
self.setup()
self.root.mainloop()
def setup(self):
self.old_x = None
self.old_y = None
self.line_width = self.choose_size_button.get()
self.color = self.DEFAULT_COLOR
self.eraser_on = False
self.active_button = self.pen_button
################
self.line_start_x = None
self.line_start_y = None
self.Line_objects = []
self.temp_stack = []
self.undo_stack = []
self.redo_stack = []
self.c.bind('<Button-1>', self.paint)#クリックを押した
#self.c.bind('<Button-1>', self.line_start)#クリックを押した
self.c.bind('<B1-Motion>', self.paint)#ドラッグした
#self.c.bind('<B1-Motion>', self.line_motion)#ドラッグした
self.c.bind('<ButtonRelease-1>', self.reset)#クリックを離した
#self.c.bind('<ButtonRelease-1>', self.line_end)#クリックを離した
################
#####################################################
def line_start(self,event):
self.line_start_x=event.x
self.line_start_y=event.y
def line_motion(self,event):
self.c.delete('temp_line_objects')
self.c.create_line(self.line_start_x,self.line_start_y,event.x,event.y,fill=self.DEFAULT_COLOR,smooth=1,tags='temp_line_objects')
def line_end(self,event):
x=self.c.create_line(self.line_start_x,self.line_start_y,event.x,event.y,fill=self.DEFAULT_COLOR,smooth=1)
self.Line_objects.append(x)
self.undo_stack.append(x)
self.redo_stack.clear()#描き始めたらそれまでのredoスタックは削除
#####################################################
def use_pen(self):
self.activate_button(self.pen_button)
def use_brush(self):
self.activate_button(self.brush_button)
def choose_color(self):
self.eraser_on = False
self.color = askcolor(color=self.color)[1]
def use_eraser(self):
self.activate_button(self.eraser_button, eraser_mode=True)
def erase(self):
self.c.delete("temp")
def activate_button(self, some_button, eraser_mode=False):
self.active_button.config(relief=RAISED)
some_button.config(relief=SUNKEN)
self.active_button = some_button
self.eraser_on = eraser_mode
#
def decide_size(self):
self.line_width = self.size_box.get()
#self.choose_size_button = self.size_box.get()
#
def paint(self, event):
#
if self.temp_size != self.choose_size_button.get():
self.line_width = self.choose_size_button.get()
self.temp_size = self.choose_size_button.get()
#self.line_width = self.choose_size_button.get()
#
paint_color = 'white' if self.eraser_on else 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, tag="temp")
z=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)
self.temp_stack.append(z)
self.old_x = event.x
self.old_y = event.y
def reset(self, event):
self.undo_stack.append(self.temp_stack)
#self.temp_stack.clear()
self.redo_stack.clear()#描き始めたらそれまでのredoスタックは削除
self.old_x, self.old_y = None, None
def undo(self):
x = self.undo_stack.pop()
while(self.temp_stack):
y = self.temp_stack.pop()
self.c.delete(y)
def redo(self):
x = 1
if __name__ == '__main__':
Paint()