<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()
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/21 05:42