##線をマウスで書くときに角度を使用して実際のカーソルの動きとは異なる線を表示したい
tkinterを使ってマウスで線を書きたいです。
カーソルで書いた線と実際の動きと連動する線を表示することはできたのですが、2本とも同じ動きをするのでそれをバラバラの動きにしたいです。
例:上から下にまっすぐにカーソルを動かすと実際に表示される線は斜めに表示されるなど。
自分でもやり方を調べてみたものの、わからないので教えてもらえたら幸いです。
該当のソースコード
Python
ソースコード
import tkinter
from PIL import Image, ImageDraw
from tkinter import filedialog
class Application(tkinter.Frame):
def init(self, master=None):
super().init(master)
self.master = master
self.master.title('tkinter canvas trial')
self.pack()
self.create_widgets()
self.setup()
def create_widgets(self): self.vr = tkinter.IntVar() self.vr.set(1) self.test_canvas = tkinter.Canvas(self, bg='white', width=1000, height=600) self.test_canvas.create_line(500, 0,500,600) self.test_canvas.grid(row=1, column=0, columnspan=4) self.test_canvas.bind('<B1-Motion>', self.paint)#押されたときに取得した位置と現在のマウスカーソル位置で移動距離を計算し、再配置 self.test_canvas.bind('<ButtonRelease-1>', self.reset)#次に画面をタップする座標を調整する(保持していた座標をクリアする) button = tkinter.Button(root, text = "画面切り替え") #ボタンWidgetを生成 button.place(x=5, y=5) #ボタンを配置 def setup(self): self.old_x = None self.old_y = None self.line_x = None self.line_y = None self.color = 'black' self.eraser_on = False self.im = Image.new('RGB', (600, 600), 'white') self.draw = ImageDraw.Draw(self.im) def change_radio(self): if self.vr.get() == 1: self.eraser_on = False else: self.eraser_on = True def clear_canvas(self): self.test_canvas.delete(tkinter.ALL) def save_canvas(self): self.test_canvas.postscript(file='out.ps', colormode='color') def paint(self, event): if self.eraser_on: paint_color = 'white' else: paint_color = 'black' if self.line_x and self.line_y: self.test_canvas.create_line(self.line_x, self.line_y, event.x, event.y, width=5.0, fill=paint_color, capstyle=tkinter.ROUND, smooth=tkinter.TRUE, splinesteps=36) self.draw.line((self.line_x, self.line_y, event.x, event.y), fill=paint_color, width=5) self.line_x = event.x self.line_y = event.y if self.old_x and self.old_y: self.test_canvas.create_line(self.old_x, self.old_y*1.1, event.x, event.y*1.1, width=5.0, fill=paint_color, capstyle=tkinter.ROUND, smooth=tkinter.TRUE, splinesteps=36) self.draw.line((self.old_x, self.old_y, event.x, event.y), fill=paint_color, width=5) self.old_x = event.x self.old_y = event.y def reset(self, event): self.line_x, self.line_y = None, None self.old_x, self.old_y = None, None
root = tkinter.Tk()
app = Application(master=root)
app.mainloop()
回答1件
あなたの回答
tips
プレビュー