質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

834閲覧

マウスの動きとは異なる線の表示をしたい

shibububu1117

総合スコア3

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/12 17:13

##線をマウスで書くときに角度を使用して実際のカーソルの動きとは異なる線を表示したい

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/12/13 01:01

インデントをつけていただけませんか。
guest

回答1

0

ベストアンサー

例えば以下の様にすると、カーソルで書いた線の周囲にもう一本の線が sin カーブ状に描画されます。

python

1import math 2 : 3 4class Application(tkinter.Frame): 5 : 6 7 def setup(self): 8 : 9 self.n = 1.0 10 : 11 12 def paint(self, event): 13 : 14 15 y = event.y 16 if self.old_x and self.old_y: 17 self.n += 0.2 18 y += 0.3*math.sin(self.n)*event.y 19 self.test_canvas.create_line(self.old_x, self.old_y, event.x, y, width=2.0, fill='red', capstyle=tkinter.ROUND, smooth=tkinter.TRUE, splinesteps=36) 20 self.old_x = event.x 21 self.old_y = y

イメージ説明

投稿2021/12/13 01:18

melian

総合スコア19749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shibububu1117

2021/12/13 04:12

ありがとうございます!助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問