python-3.x 由于方法问题,Canvas无法正确绘制线条

svmlkihl  于 2023-05-23  发布在  Python
关注(0)|答案(1)|浏览(162)

方法“start”和“clearline”只在我的鼠标光标在tkinter窗口而不是画布上时起作用
但重点是在画布上画线。怎么会这样?
尝试将(self.canvas)作为方法参数而不是(self),但它不起作用,并且在方法上没有太多的更改,所以我不知道
我是初学者请提供例子

import tkinter as tk

size = [960,800]

line_id = None
line_points = []
line_options = {}

class Window(tk.Frame):
    
    def __init__(self):
        
        tk.Frame.__init__(self)
        self.master.title("Calcul mental")
        self.master.minsize(size[0],size[1])
        self.grid(sticky=tk.E+tk.W+tk.N+tk.S)
        
        top=self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)
        
        global  line_id, line_points, line_options
        
        self.canvas = tk.Canvas( self,border=5,bg = "white", width=size[0], height=size[1]/2 )
        self.canvas.grid()
        
        self.bind('<Button-1>', self.set_start)
        self.bind('<B1-Motion>', self.draw_line)
        self.bind('<ButtonRelease-1>', self.end_line)
        self.bind('<Button-3>', self.clear_line)
        
    def draw_line(self,event):
        global line_id,line_points,line_options
        print("draw")
        line_points.extend((event.x, event.y))
        line_id = self.canvas.create_line(line_points, **line_options,tags="draw")

    def set_start(self,event):
        global line_points
        print("start")
        line_points.extend((event.x, event.y))

    def end_line(self,event=None):
        global line_id
        print('end')
        line_points.clear()
        line_id = None

    def clear_line(self,event):
        print("clear line")
        self.canvas.delete("draw")

Window().mainloop()
lsmepo6l

lsmepo6l1#

感谢@Bryan奥克利和@acw1668的帮助=)
我改变了

self.bind('<Button-1>', self.set_start)
self.bind('<B1-Motion>', self.draw_line)
self.bind('<ButtonRelease-1>', self.end_line)
self.bind('<Button-3>', self.clear_line)

self.canvas.bind('<Button-1>', self.set_start)
self.canvas.bind('<B1-Motion>', self.draw_line)
self.canvas.bind('<ButtonRelease-1>', self.end_line)
self.canvas.bind('<Button-3>', self.clear_line)

而且很有效

相关问题