复选框改变画布上对象颜色

0 投票
2 回答
972 浏览
提问于 2025-04-18 00:55

我搞不清楚怎么让一个复选框在选中时填充对象的颜色。我知道我可以在创建对象的时候就设置好颜色,但不太确定怎么在之后用复选框来改变它们的颜色。

from tkinter import *

class box:
    def __init__(self):
        window = Tk()
        window.title("Radiobuttons and Checkbuttons")

        self.canvas = Canvas(window, width = 400, height = 100, bg = 'white')
        self.canvas.pack()

        frame = Frame(window)
        frame.pack()
        frame2 = Frame(window)
        frame2.pack()

        self.v1 = IntVar()
        self.v2 = IntVar()
        cbtFilled = Checkbutton(frame2,text= "Filled",variable = self.v2, command = self.processCheckButton).pack(side=RIGHT)
        rbRect = Radiobutton(frame2, text = "Rectangle", variable = self.v1, value = 1, command = self.processRadiobutton).pack(side=LEFT)
        rbOval = Radiobutton(frame2, text = "Oval", variable = self.v1, value = 2, command = self.processRadiobutton).pack(side = RIGHT)

    def processCheckButton(self):
        if self.v2.get() == 1:
            print("Checked")
        else:
            print("unchecked")

    def processRadiobutton(self):
        if self.v1.get() == 1:
            self.drawRectangle()
        else:
            self.drawOval()

    def drawRectangle(self):
        self.clearCanvas()
        self.canvas.create_rectangle(35, 10 ,350,90,tags = 'rect')

    def drawOval(self):
        self.clearCanvas()
        self.canvas.create_oval(50, 10, 350, 100, tags = 'oval')

    def clearCanvas(self):
        self.canvas.delete('rect','oval')



box()

2 个回答

0

从tkinter库中导入所有内容

定义一个叫做box的类:

在这个类里,有一个初始化的方法(init),这个方法会在你创建这个类的对象时自动运行。这个方法里做了以下几件事:

  • 创建一个窗口,叫做window。
  • 给这个窗口起个名字,叫“单选按钮和复选按钮”。
  • 在窗口里创建一个框架(frame),用来放其他的组件。
  • 把这个框架放到窗口里。
  • 在框架里创建一个画布(canvas),宽400像素,高100像素,背景是白色的。
  • 把这个画布放到框架里。
    frame2 = Frame(window)
    frame2.pack()

    self.v1 = IntVar()
    self.v2 = IntVar()
    cbtFilled = Checkbutton(frame2,text= "Filled",variable = self.v2, command = self.processCheckButton).pack(side=RIGHT)
    rbRect = Radiobutton(frame2, text = "Rectangle", variable = self.v1, value = 1, command = self.processRadiobutton).pack(side=LEFT)
    rbOval = Radiobutton(frame2, text = "Oval", variable = self.v1, value = 2, command = self.processRadiobutton).pack(side = RIGHT)

def processCheckButton(self):
    if self.v2.get() == 1:
        self.clearCanvas()
        if self.v1.get() == 1:
            self.drawRectangle1()
        elif self.v1.get()==2:
            self.drawOval1()
       # print("Checked")

    else:
        self.processRadiobutton()
        #print("unchecked")

def processRadiobutton(self):
    if self.v1.get() == 1:
        self.drawRectangle()
    else:
        self.drawOval()

def drawRectangle(self):
    self.clearCanvas()
    self.canvas.create_rectangle(35, 10 ,350,90,tags = 'rect')

def drawOval(self):
    self.clearCanvas()
    self.canvas.create_oval(50, 10, 350, 100, tags = 'oval')

def clearCanvas(self):
    self.canvas.delete('rect','oval')

def drawRectangle1(self):
    self.clearCanvas()
    self.canvas.create_rectangle(35, 10 ,350,90,fill = 'red',tags = 'rect')

def drawOval1(self):
    self.clearCanvas()
    self.canvas.create_oval(50, 10, 350, 100, fill= 'blue',tags = 'oval')

创建一个box类的对象。

0

通过把这些形状分配给变量,我可以使用itemconfigure()这个方法来改变它们。

self.item=self.canvas.create_oval(50, 10, 350, 100, tags = 'oval')
self.item=self.canvas.create_rectangle(35, 10 ,350,90,tags = 'rect')

def processCheckButton(self):
    if self.v2.get() == 1:
        self.canvas.itemconfigure(self.item,fill='black')
    else:

        self.canvas.itemconfigure(self.item,fill='white')

撰写回答