使用 Tk 在 Python 中单击更改矩形颜色
Changing rectangle color on click in Python using Tk
我正在尝试在 canvas 上创建一个 Tk 矩形,以便在单击时更改其颜色。现在,单击矩形时不会发生颜色变化。我需要做哪些不同的事情?
顺便说一句,这是在 Python3.5 中。
from tkinter import *
def set_color(id):
global alive, colors
alive = not alive
col = colors[alive]
canvas.itemconfigure(id, fill=col)
root = Tk()
canvas = Canvas(root)
canvas.grid(column=1, row=1, sticky=(N, S, E, W))
alive = False
colors = {True: "green", False: "red"}
id = canvas.create_rectangle((1, 1, 60, 60), fill="red")
canvas.tag_bind(id, "<ButtonPress-1>", set_color)
root.mainloop()
tag_bind 向函数发送一个事件,因此 "id" 被覆盖并且现在包含该事件。所以你可以从
def set_color(id):
## to
def set_color(event=None):
它会工作,因为在这个程序中只有一个 object/id 需要处理。使用 event=None 是因为它在没有事件发送到函数时分配默认值,例如在按下按钮时,因此适用于所有响应。
将其包装在 class 中并创建任意数量的实例。 http://www.freenetpages.co.uk/hp/alan.gauld/tutclass.htm
class OneSquare():
def __init__(self, can, start_x, start_y, size):
self.can=can
self.id = self.can.create_rectangle((start_x, start_y,
start_x+size, start_y+size), fill="red")
self.can.tag_bind(self.id, "<ButtonPress-1>", self.set_color)
self.color_change=True
def set_color(self, event=None):
self.color_change = not self.color_change
color="red"
if not self.color_change:
color="green"
self.can.itemconfigure(self.id, fill=color)
root = Tk()
canvas = Canvas(root)
canvas.grid(column=1, row=1, sticky=(N, S, E, W))
OS1=OneSquare(canvas, 1, 1, 60)
OS2=OneSquare(canvas, 90, 1, 30)
OS3=OneSquare(canvas, 1, 90, 90)
Button(root, text="Exit", bg="orange",
command=root.quit).grid(row=2)
root.mainloop()
我正在尝试在 canvas 上创建一个 Tk 矩形,以便在单击时更改其颜色。现在,单击矩形时不会发生颜色变化。我需要做哪些不同的事情?
顺便说一句,这是在 Python3.5 中。
from tkinter import *
def set_color(id):
global alive, colors
alive = not alive
col = colors[alive]
canvas.itemconfigure(id, fill=col)
root = Tk()
canvas = Canvas(root)
canvas.grid(column=1, row=1, sticky=(N, S, E, W))
alive = False
colors = {True: "green", False: "red"}
id = canvas.create_rectangle((1, 1, 60, 60), fill="red")
canvas.tag_bind(id, "<ButtonPress-1>", set_color)
root.mainloop()
tag_bind 向函数发送一个事件,因此 "id" 被覆盖并且现在包含该事件。所以你可以从
def set_color(id):
## to
def set_color(event=None):
它会工作,因为在这个程序中只有一个 object/id 需要处理。使用 event=None 是因为它在没有事件发送到函数时分配默认值,例如在按下按钮时,因此适用于所有响应。
将其包装在 class 中并创建任意数量的实例。 http://www.freenetpages.co.uk/hp/alan.gauld/tutclass.htm
class OneSquare():
def __init__(self, can, start_x, start_y, size):
self.can=can
self.id = self.can.create_rectangle((start_x, start_y,
start_x+size, start_y+size), fill="red")
self.can.tag_bind(self.id, "<ButtonPress-1>", self.set_color)
self.color_change=True
def set_color(self, event=None):
self.color_change = not self.color_change
color="red"
if not self.color_change:
color="green"
self.can.itemconfigure(self.id, fill=color)
root = Tk()
canvas = Canvas(root)
canvas.grid(column=1, row=1, sticky=(N, S, E, W))
OS1=OneSquare(canvas, 1, 1, 60)
OS2=OneSquare(canvas, 90, 1, 30)
OS3=OneSquare(canvas, 1, 90, 90)
Button(root, text="Exit", bg="orange",
command=root.quit).grid(row=2)
root.mainloop()