[PYTHON] Get drawing information every set time in Tkinter

Introduction

A library for writing GUI programs in Python Tkinter. In this library, you can draw a picture using the Canvas inside.

I think that every human being has the opportunity to draw a picture using Canvas, but I couldn't find out clearly by examining the program that acquires the information written in Canvas at set intervals. I will write a program that also serves as a memorandum.

By the way, the program itself to draw a picture using Canvas referred to the following site. Draw a line on Python canvas with mouse

Execution environment

code

#!/usr/bin/env python
# -*- coding: utf8 -*-
import tkinter
import time
from PIL import Image, ImageDraw

class Application(tkinter.Frame):
	def __init__(self, master=None):
		super().__init__(master)
		self.master = master
		self.master.title('Measure the time to draw')
		self.create_variables()
		self.create_widgets()
		self.pack()

	def create_widgets(self):
		self.draw_canvas = tkinter.Canvas(self, bg='white', width=self.img_size[0], height=self.img_size[1])
		self.draw_canvas.grid(row=1, column=0, columnspan=4)
		self.draw_canvas.bind('<Button-1>', self.start)
		self.draw_canvas.bind('<B1-Motion>', self.paint)
		self.draw_canvas.bind('<ButtonRelease-1>', self.reset)
	
	def create_variables(self):
		self.img_size = (600, 600)
		self.old_x, self.old_y = None, None
		self.color = 'black'
		self.pen_width = 5.0
		self.im = Image.new('RGB', self.img_size, 'white')
		self.draw = ImageDraw.Draw(self.im)
		
		self.tick_time = 30
		self.timer_id = None
		self.start_time = None
		
	#methods
	def start(self, event):
		if self.timer_id is None:
			self.timer_start()
		self.draw_canvas.create_line(event.x, event.y, event.x, event.y, width=self.pen_width, fill=self.color, capstyle="round", smooth=True, splinesteps=36)
		self.draw.line((event.x, event.y, event.x, event.y), fill=self.color, width=int(self.pen_width))
		self.old_x, self.old_y = event.x, event.y
	
	def paint(self, event):
		if self.old_x and self.old_y:
			self.draw_canvas.create_line(self.old_x, self.old_y, event.x, event.y, width=self.pen_width, fill=self.color, capstyle="round", smooth=True, splinesteps=36)
			self.draw.line((self.old_x, self.old_y, event.x, event.y), fill=self.color, width=int(self.pen_width))
		self.old_x, self.old_y = event.x, event.y

	def reset(self, event):
		self.old_x, self.old_y = None, None
		self.timer_reset()
		
	#timer
	def timer_start(self):
		if self.timer_id is not None:
			self.after_cancel(self.timer_id)
		self.start_time = time.time()
		self.timer_id = self.after(self.tick_time, self.timer_count)
	
	def timer_count(self):
		t = time.time() - self.start_time
		x = self.old_x if self.old_x is not None else -1
		y = self.old_y if self.old_y is not None else -1
		print("elapsed time:%f ,X position%d,Y position%d" % (t, x, y))
		self.timer_id = self.after(self.tick_time, self.timer_count)
	
	def timer_reset(self):
		if self.timer_id is None:
			return
		self.after_cancel(self.timer_id)
		self.timer_id = None

if __name__ == "__main__":
	root = tkinter.Tk()
	app = Application(master=root)
	app.mainloop()

Execution result

When you run it, you will see a canvas for drawing. When I draw a picture on this canvas with the mouse, it becomes a terminal

スクリーンショット 2020-09-28 6.25.23.png

Commentary

Functions related to timer behavior are defined by _timer_start () _, _timer_count () _, _timer_reset () _. These functions are called in response to _start () _, _reset () _ bound to Canvas, and now _timer_count () _ is called every time defined in the tick_time variable by the _after () _ function. It is supposed that the drawing information of

Finally

It was my first article writing.

I was just stuck in writing letters and investigating how to write them, so I hope this program will be useful in situations where you want to get handwritten online information.

reference

Draw a line on Python canvas with mouse [tkinter - .after() - RIP Tutorial] (https://riptutorial.com/ja/tkinter/example/22870/-after--)

Recommended Posts

Get drawing information every set time in Tkinter
Get drawing information every set time in Tkinter
Get date and time in specified format
Get JST current time in ISO 8601 notation
Get time series data from k-db.com in Python
Get environment variables in Python, otherwise set default values
Get standard output in real time with Python subprocess