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

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

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

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

Python

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

Q&A

解決済

3回答

1329閲覧

<B1-Motion>を使用して複数の動作をする

shibububu1117

総合スコア3

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/12/20 04:47

<B1-Motion>を使用して線を書く動作と背景の色が範囲によって変わる動作をしたいです。
しかし<B1-Motion>を二つ使用するとどちらかしか実行できません。
そもそも<B1-Motion>で二つの関数を動かすことは不可能なのでしょうか?

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 self.changebg_flag = False 16 17 18 def create_widgets_Line(self): 19 self.vr = tkinter.IntVar() 20 self.vr.set(1) 21 22 self.test_canvas = tkinter.Canvas(self, bg="#fff", width=1400, height=700) 23 self.test_canvas.grid(row=1, column=0, columnspan=4) 24 self.test_canvas.bind('<B1-Motion>',self.paint)#押されたときに取得した位置と現在のマウスカーソル位置で移動距離を計算し、再配置 25 self.test_canvas.bind('<ButtonRelease-1>', self.reset)#次に画面をタップする座標を調整する(保持していた座標をクリアする) 26 button3 = tkinter.Button(root, text = "線を消す",command=self.clear_canvas) #ボタンWidgetを生成 27 button3.place(x=5, y=65) #ボタンを配置 28 #------------背景チェンジ------------------------------ 29 self.button_changebg=tkinter.Button(root,text="背景変化") 30 self.button_changebg.place(x=160,y=5) 31 self.button_changebg.config(state="disabled") 32 self.button_changebg.bind("<Button-1>", self.toggle_changebg) 33 self.test_canvas.bind('<B1-Motion>',self.changebg)#ここを消すと線は書けるが、背景が変わらない。。。しかしここを付け加えると背景は変わるが線は引けない。。。 34 35 36 def toggle_changebg(self, _): 37 self.changebg_flag = not self.changebg_flag 38 self.button_changebg.config(state=["disabled", "normal"][self.changebg_flag]) 39 40 def changebg(self, event): 41 if not self.changebg_flag: 42 return 43 if event.y<100: 44 self.test_canvas['bg']='gray40' 45 elif 100<event.y<250: 46 self.test_canvas['bg']='gray0' 47 elif 250<event.y<400: 48 self.test_canvas['bg']='gray40' 49 elif 400<event.y<550: 50 self.test_canvas['bg']='gray0' 51 elif 550<event.y<700: 52 self.test_canvas['bg']='gray40' 53 54 55 56 def setup(self): 57 self.line_x = None 58 self.line_y = None 59 self.color1 = "#000"#黒 60 self.eraser_on = False 61 self.im = Image.new('RGB', (600, 600), "#fff") 62 self.draw = ImageDraw.Draw(self.im) 63 64 def change_radio(self): 65 if self.vr.get() == 1: 66 self.eraser_on = False 67 else: 68 self.eraser_on = True 69 70 def clear_canvas(self):#画面に書いたものを消す 71 self.test_canvas.delete(tkinter.ALL) 72 73 74 def paint(self, event):#マウスで線を書く 75 76 if self.eraser_on: 77 paint_color1 = "#000" 78 else: 79 paint_color1 = "#000" 80 81 if self.line_x and self.line_y: 82 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) 83 self.draw.line((self.line_x, self.line_y, event.x, event.y), fill=paint_color1, width=5) 84 self.line_x = event.x 85 self.line_y = event.y 86 87 def reset(self, event): 88 self.line_x, self.line_y = None, None 89 90 91root = tkinter.Tk() 92app = Application(master=root) 93app.mainloop()

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

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

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

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

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

guest

回答3

0

<B1-Motion>で二つの関数を動かすことは不可能なのでしょうか?

別解で、bind に複数の関数を追加する場合の add というオプションがあります。

self.test_canvas.bind('<B1-Motion>', self.changebg, add="+")

投稿2021/12/20 12:53

teamikl

総合スコア8664

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

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

shibububu1117

2021/12/21 05:42

なるほどそういうのがあるんですね!参考になります!ありがとうございます!
guest

0

ベストアンサー

paint() の最後で changebg() を実行してみてはどうでしょうか。

python

1 def paint(self, event):#マウスで線を書く 2 : 3 4 self.line_x = event.x 5 self.line_y = event.y 6 self.changebg(event)

投稿2021/12/20 06:11

melian

総合スコア19618

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

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

shibububu1117

2021/12/20 06:25

回答ありがとうございます。やってみましたが、ボタンを押したら背景だけが変わってしまいます。
melian

2021/12/20 06:26

self.test_canvas.bind('<B1-Motion>',self.changebg) は削除していますか?
shibububu1117

2021/12/20 06:41

削除したらできました!<B1-Motion>を同じ関数で同時に実行していたということだったんですね。 ありがとうございます!
guest

0

以下のメソッドを呼び出せばよいでしょう。

python

1 def B1Motion(self, event): 2 self.paint(event) 3 self.changebg(event)

投稿2021/12/20 04:58

編集2021/12/20 06:38
ppaul

総合スコア24666

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

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

shibububu1117

2021/12/20 05:28

回答ありがとうございます。B1Motionメゾっとを呼び出した結果 TypeError: paint() takes 2 positional arguments but 3 were given このようなエラーが出てしまいました。 def B1Motion(self,event) self.paint(event) self.changebg(event) でやってみたら動くのですが、やはり同時に動かすことができないです。。
melian

2021/12/20 06:26 編集

間違えてしまいました。
ppaul

2021/12/20 06:39

def B1Motion(self,event) self.paint(event) self.changebg(event) で同時に動きませんか。どうなるのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問