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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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/18 06:57

編集2021/12/18 07:18

カーソルのX座標が0~175の時とカーソルのX座標が175~350の時でマウスで書いた線のずれ方を変えるのはできました。
しかしカーソルが175~350の範囲に入った瞬間変な感じになってしまいます。
黒色の線が実際のマウスの動き方で緑色の線が異なるずれ方をするせんです。
現実:
イメージ説明
理想:
イメージ説明
これを滑らかに変化するようにしたいです。もしどなたかわかる方いらっしゃったら教えてほしいです。。。

Python

1import tkinter 2from PIL import Image, ImageDraw 3from tkinter import filedialog 4import math 5import time 6 7class Application(tkinter.Frame): 8 def __init__(self, master=None): 9 super().__init__(master) 10 self.master = master 11 self.master.title('tkinter canvas trial') 12 self.pack() 13 self.create_widgets_Line() 14 self.setup() 15 16 17 def create_widgets_Line(self): 18 self.vr = tkinter.IntVar() 19 self.vr.set(1) 20 self.test_canvas = tkinter.Canvas(self, bg="#fff", width=350, height=700) 21 self.test_canvas.create_line(0,0,0,700,width = 1) 22 self.test_canvas.create_line(175,0,175,700,width = 1,fill='gray31') 23 self.test_canvas.create_line(350,0,350,700,width = 1,fill='gray31') 24 self.test_canvas.grid(row=1, column=0, columnspan=4) 25 self.test_canvas.bind('<B1-Motion>', self.paint)#押されたときに取得した位置と現在のマウスカーソル位置で移動距離を計算し、再配置 26 self.test_canvas.bind('<ButtonRelease-1>', self.reset)#次に画面をタップする座標を調整する(保持していた座標をクリアする) 27 28 def setup(self): 29 self.old_x = None 30 self.old_y = None 31 self.line_x = None 32 self.line_y = None 33 self.color = "#008000"#緑 34 self.color1 = "#000"#黒 35 self.L1=1.0 36 self.L2=1.0 37 self.L3=1.0 38 self.eraser_on = False 39 self.im = Image.new('RGB', (600, 600), "#fff") 40 self.draw = ImageDraw.Draw(self.im) 41 42 def change_radio(self): 43 if self.vr.get() == 1: 44 self.eraser_on = False 45 else: 46 self.eraser_on = True 47 48 def save_canvas(self): 49 self.test_canvas.postscript(file='out.ps', colormode='color') 50 51 def paint(self, event): 52 if self.eraser_on: 53 paint_color = "#000" 54 else: 55 paint_color = "#008000" 56 57 if self.eraser_on: 58 paint_color1 = "#000" 59 else: 60 paint_color1 = "#000" 61 62 #実際の線 63 if self.line_x and self.line_y: 64 self.test_canvas.create_line(self.line_x, self.line_y, event.x, event.y, width=5.0, fill=paint_color1, capstyle=tkinter.ROUND, smooth=tkinter.TRUE, splinesteps=36) 65 self.draw.line((self.line_x, self.line_y, event.x, event.y), fill=paint_color1, width=5) 66 self.line_x = event.x 67 self.line_y = event.y 68 #ずれる線 69 y=event.y#実際のマウスx座標 70 x=event.x#実際のマウスy座標 71 if event.x<175: 72 if self.old_x and self.old_y: 73 self.L1+=0.1#ずれ方の指定 74 y-=self.L1+1 75 x+=self.L1*3 76 self.test_canvas.create_line(self.old_x, self.old_y,x, y, width=5.0, fill=paint_color, capstyle=tkinter.ROUND, smooth=tkinter.TRUE, splinesteps=36) 77 self.old_x = x#ずれる線の表示 78 self.old_y = y 79 80 elif 175<event.x<350: 81 if self.old_x and self.old_y: 82 self.L2+=0.1 83 y-=(self.L2+1)#event.y 84 x-=(self.L2*3)#event.x 85 self.test_canvas.create_line(self.old_x, self.old_y,x, y, width=5.0, fill=paint_color, capstyle=tkinter.ROUND, smooth=tkinter.TRUE, splinesteps=36) 86 self.old_x = x 87 self.old_y = y 88 89 90 def reset(self, event): 91 self.line_x, self.line_y = None, None 92 self.old_x, self.old_y = None, None 93 94root = tkinter.Tk() 95app = Application(master=root) 96app.mainloop()

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

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

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

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

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

TakaiY

2021/12/18 07:05

pythonのコードはインデントが無いと読めません。 質問を編集して、コードを<code>ボタンを押して出る「```ここに言語を入力]と「```」の間の行にコードを入れて、 「ここに言語を入力」のところをpythonに書き換えてください。
shibububu1117

2021/12/18 07:19

修正依頼ありがとうございます。コードのインデントを修正いたしました。
guest

回答1

0

ずれの量を L1, L2 で設定していますが、175を越えて切り替わったときに、それまで蓄積していたL1への変分を考慮せずに、L2の初期値に切り替えてしまっているからです。

そもそも、ロジックが間違えているように思います。
175を境にしてどのようにずらしたいのでしょう?
そのあたりをもう一度考察してみてはいかがでしょう。

投稿2021/12/18 09:25

TakaiY

総合スコア13790

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問