问题描述
我有一个代码可以将检查按钮粘贴到画布中。如果单击,它们也会更改颜色。如果单击从头开始设置的另一个复选按钮,则希望能够用鼠标单击在我选择的2个复选按钮之间画一条线。当我单击第一个检查按钮时,我还需要用线条来更改颜色。有什么建议怎么做?
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)
并将其绑定到其他行为,反之亦然。
所以我会这样:
- 定义一个类,该类将在您的Canvas上放置一个Checkbutton并按照您的喜好进行操作。
- 使用defaultdict跟踪实例在全局名称空间中的某个位置
- 定义一个创建类实例的函数。
- 编写重新绑定您的
Button-1
的函数