【问题标题】:Writing a code for a Canvas window in Python在 Python 中为 Canvas 窗口编写代码
【发布时间】: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


【解决方案1】:

这是您的代码的工作版本:

from tkinter import *

class MyCanvas:
    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")

MyCanvas()
  • 更改了你的类名以避免冲突
  • 评论了btClear,因为它没有定义

它的外观如下:


如果您使用 Visual Studio 代码,所有这些语法错误都非常容易发现和修复:

【讨论】:

    【解决方案2】:

    我知道错误,

    self.canvas = Canvas(window, width = 200, height = 100, bg = "white")
    

    你的类名是 Canvas 并且你正在使用 tkinter.Canvas 这使得 tkinter.Canvas 成为 Canvas 类

    所以,正确的代码是在代码中将 Canvas 更改为 tkinter.Canvas 并且 DO NOT TYPE TKINTER.CANVAS AS CANVAS BECAUSE it was defined as CLASS

    或者您可以将您的班级名称更改为 创建画布,而不是画布

    class CreateCanvas():
    

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 1970-01-01
      • 2017-12-25
      • 2023-01-13
      • 2022-01-19
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多