Написание кода для окна Canvas в Python - PullRequest
1 голос
/ 30 сентября 2019

Итак, я пытаюсь заставить Canvas отобразить окно с кнопками, которые отображают фигуры при нажатии (я также пытаюсь заставить его задать флажок , который заполняетв формах, но это не важно в данный момент), но каждый раз, когда я запускаю программу, она отображает такие вещи, как:

Traceback (последний вызов был последним): файл "C: \ Users \ Brandons \ Desktop\ school files \ Sdev 220 Python \ 9.3ometricfigures.py ", строка 35, в Canvas () Файл" C: \ Users \ Brandons \ Desktop \ school files \ Sdev 220 Python \ 9.3 geometryfigures.py ", строка 13, в init self.canvas = Canvas (окно, ширина = 200, высота = 100, bg = "white") Ошибка типа: init () получила неожиданный аргумент ключевого слова 'width'

Поэтому, когда это произошло, я попытался удалить эту информацию, потому что подумал, что она, возможно, мешает ей, но затем продолжил говорить, что аргументы высота и bg были неожиданными аргументами ключевого слова, поэтому я тоже удалил их. После удаления я запустил программу, оставив только ключевое слово окна, но на этот раз оно показало:

Traceback (последний вызов был последним): файл "C: \ Users \ Brandons \ Desktop \ school files \"Sdev 220 Python \ 9.3 geometryfigures.py ", строка 35, в файле Canvas ()" C: \ Users \ Brandons \ Desktop \ school files \ Sdev 220 Python \ 9.3 geometryfigures.py ", строка 13, в init self.canvas = Canvas (window) TypeError: init () принимает 1 позиционный аргумент, но было дано 2

В конце я также удалил ключевое слово окна. Но когда я сделал это, он запустил программу, но по какой-то причине ничего не появилось, даже ошибка или что-то еще. Так что теперь я не уверен, что делать, так как я уверен, что что-то должно быть там, но я не уверен, как реализовать это, не вызывая ошибки, и чтобы оно действительно отображало окно и кнопки.

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()

, когда я запускаю программу, все работает, за исключением флажка, не меняющего цвет форм, которые я делаю. Я не могу найти в книге ничего такого, что могло бы привести к изменению цвета того, что уже есть в коде.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Я знаю ошибку,

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

Ваше имя класса - Canvas, и вы используете tkinter.Canvas, который превращает tkinter.Canvas в класс Canvas

Итак, правильный кодизмените Canvas на tkinter.Canvas в коде и НЕ ТИПИРУЙТЕ TKINTER.CANVAS КАК ХОЛСТ, ПОТОМУ ЧТО ЭТО ОПРЕДЕЛЕНО КАК КЛАСС *

Или вы можете изменить имя вашего класса на CreateCanvas, а не Canvas

class CreateCanvas():
0 голосов
/ 30 сентября 2019

Вот рабочая версия вашего кода:

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, все эти синтаксические ошибки действительно легко обнаружить и исправить:

...