在python中用鼠标单击选择的2个复选按钮之间画一条线

问题描述

我有一个代码可以将检查按钮粘贴到画布中。如果单击,它们也会更改颜色。如果单击从头开始设置的另一个复选按钮,则希望能够用鼠标单击在我选择的2个复选按钮之间画一条线。当我单击第一个检查按钮时,我还需要用线条来更改颜色。有什么建议怎么做?

line should be straight

    from tkinter import *

root = Tk()

buttons = []

class CMD: #Auxilliary function for callbacks using parameters. Syntax: CMD(function,argument1,argument2,...)
    def __init__(s1,func,*args):
        s1.func = func
        s1.args = args
    def __call__(s1,*args):
        args = s1.args+args
        s1.func(*args)

 def color_checkbutton(pos=0):  # define the colors of the checkbutton
    if buttons[pos][0].get() == 1:
        buttons[pos][2].configure(bg='red')
    else:
        buttons[pos][2].configure(bg='green')

def place_checkbutton_in_canvas(e):  # order to insert the checkbutton
    if len(str(e.widget))<3: ## Don't place a new one if a checkBox was clicked
        b = Intvar()
        pos = len(buttons)
        xx_and = e.x
        yy_and = e.y
        buttons.append([b,pos,Checkbutton(root,variable=b,textvariable=b,command=CMD(color_checkbutton,pos))])
        buttons[-1][2].place(x=xx_and,y=yy_and)
        color_checkbutton(pos)

root.bind('<Button-1>',place_checkbutton_in_canvas)

line = Intvar()
draw_line_check = Checkbutton(root,variable=line)
draw_line_check.place(x=30,y=100)

root.mainloop()

解决方法

您将需要更多代码,而我认为您甚至还没有接近。

最重要的是,如果您不使用{{}在画布上,则没有 IN 复选框,在画布上没有按钮。 1}}中放入它们(即使在您的代码中还没有画布)。但是您希望将它们放入“画布”中,以便以后使用画布的bbox method

接下来的事情是您如何尝试保存数据,并带有更多的复选按钮,使其变得更加复杂。可以考虑使用defaultdict,甚至更好地定义create_window,您可以在其中更轻松地定位它们并为行为定义类函数。

class(object)

上面的行将需要一个命令,您可以在其中单击draw_line_check = Checkbutton(root,variable=line) 并将其绑定到其他行为,反之亦然。

所以我会这样:

  1. 定义一个类,该类将在您的Canvas上放置一个Checkbutton并按照您的喜好进行操作。
  2. 使用defaultdict跟踪实例在全局名称空间中的某个位置
  3. 定义一个创建类实例的函数。
  4. 编写重新绑定您的Button-1
  5. 的函数

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...