【发布时间】:2020-01-29 07:33:43
【问题描述】:
所以我试图让 Canvas 显示一个带有按钮的窗口,这些按钮在按下时会显示形状(我也试图让它给出一个 checkbox填充形状,但目前并不重要)但每次我运行程序时,它都会显示如下内容:
Traceback(最近一次调用最后一次):文件 "C:\Users\Brandons\Desktop\school 文件\Sdev 220 Python\9.3 geometryfigures.py",第 35 行,在 Canvas() 文件中 "C:\Users\Brandons\Desktop\school 文件\Sdev 220 Python\9.3 geometryfigures.py",第 13 行,在 init self.canvas = 画布(窗口,宽度 = 200,高度 = 100,bg = “白色”)类型错误: init() 得到了一个意外的关键字参数“宽度”
所以当这种情况发生时,我试图删除该信息,因为我认为它可能会干扰它,但它继续说参数 height 和 bg 是意想不到的关键字争论,所以我也删除了它们。删除它们后,我只剩下 window 关键字运行程序,但这次它显示:
Traceback(最近一次调用最后一次):文件 "C:\Users\Brandons\Desktop\school 文件\Sdev 220 Python\9.3 geometryfigures.py",第 35 行,在 Canvas() 文件中 "C:\Users\Brandons\Desktop\school 文件\Sdev 220 Python\9.3 geometryfigures.py",第 13 行,在 init self.canvas = Canvas(window) TypeError: init() 需要 1 个位置参数,但需要 2 个 给了
最后我也删除了 window 关键字。但是当我这样做时,它运行了程序,但由于某种原因什么都没有出现,甚至没有错误或任何东西。所以现在我不确定该怎么做,因为我确定那里需要有东西,但我不确定如何在不导致错误的情况下实现它并让它实际显示窗口和按钮。
from tkinter import *
class Canvas:
def __init__(self):
window = Tk()
window.title("Canvas")
self.canvas = Canvas(window, width = 200, height = 100, bg = "white")
self.canvas.pack()
frame = Frame(window)
frame.pack()
btRectangle = Button(frame, text = "Rectangle", command = self.displayRect)
btOval = Button(frame, text = "Oval", command = self.displayOval)
btRectangle.grid(row = 1, column = 1)
btOval.grid(row = 1, column = 2)
btClear.grid(row = 1, column = 3)
window.mainloop()
def displayRect(self):
self.canvas.create_rectangle(110, 10, 210, 80, outline = "black", tags = "rect")
def displayOval(self):
self.canvas.create_oval(110, 10, 210, 80, outline = "black", tags = "oval")
def clearCanvas(self):
self.canvas.delete("rect", "oval")
Canvas()
编辑
好的,多亏了我收到的反馈,我设法弄清楚了,但现在我在填写选中我创建的复选框时创建的形状时遇到了一些问题。
from tkinter import *
class GeofigGUI:
def __init__(self):
window = Tk()
window.title("Geometry Figures")
self.canvas = Canvas(window, width = 300, height = 200, bg = "white")
self.canvas.pack()
frame = Frame(window)
frame.pack()
self.v1 = IntVar()
cbtFill = Checkbutton(frame, text = "Fill", variable = self.v1, command = self.fillCheckbutton)
self.v2 = IntVar()
btRectangle = Button(frame, text = "Rectangle", command = self.displayRect)
btOval = Button(frame, text = "Oval", command = self.displayOval)
btClear = Button(frame, text = "Clear", command = self.clearCanvas)
btRectangle.grid(row = 1, column = 1)
btOval.grid(row = 1, column = 2)
btClear.grid(row = 1, column = 3)
cbtFill.grid(row = 1, column = 4)
window.mainloop()
def displayRect(self):
self.canvas.create_rectangle(110, 10, 210, 80, outline = "black", tags = "rect")
def displayOval(self):
self.canvas.create_oval(110, 10, 210, 80, outline = "black", tags = "oval")
def clearCanvas(self):
self.canvas.delete("rect", "oval")
def fillCheckbutton(self):
if self.v2.get() == 1:
self.canvas.itemconfigure(self.displayRect, fill = "black")
self.canvas.itemconfigure(self.displayOval, fill = "black")
else:
self.canvas.itemconfigure(self.displayRect, fill = 'white')
self.canvas.itemconfigure(self.displayOval, fill = "white")
GeofigGUI()
当我运行程序时,除了复选框不会改变我制作的形状的颜色外,它一切正常。我在书中找不到任何涉及更改代码中已有内容的颜色的内容。
【问题讨论】:
-
首先,
self.v2不指向您创建的Checkbutton。您使用的变量是self.v1。其次,你试图在一个方法上调用itemconfigure,它也没有做任何事情。由于您已经为形状创建了标签,因此您应该传递标签,即self.canvas.itemconfigure("rect", fill = "black")。
标签: python tkinter tkinter-canvas