Не получается отрисовать элементы python trkinter на холсте с использованием кнопки из другого класса обьектов

Рейтинг: 0Ответов: 0Опубликовано: 05.07.2023

Суть в том что хочу реализовать чтобы на холсте canvas отрисовивалось только количество квадратов которое указано. Пробовал различные варианты выхода из ситуации не один не подошел. Ниже представлен код в котором при вызове функции отрисовки фигур ругается на то что не знает canvas, пробовал создавать canvas в init то при вызове функции создавал новый canvas.

`from tkinter import *
from tkinter import ttk
import random
root = Tk()
root.title("figure_n")
root.geometry("800x600")
k = True



class Menu_fig:

    def __init__(self, root):
        self.id = root
        self.points = 0
        

    def draw_menu(self):
        self.menu_obj()
        self.id.mainloop()



    def menu_obj(self):
        print('menu_fig.menu_obj')
        self.frame = ttk.Frame(self.id,borderwidth=1,height=50, width= 200, padding=[2,1])
        self.frame.pack(side = TOP,anchor=N)
        self.lb = Label(self.frame,height=2, text="numbers points:",font=("Roboto", 12))
        self.lb.pack(side=LEFT)
        self.ent_text = Entry(self.frame, width=3,font=("Roboto", 12))
        self.ent_text.insert(0, "2")
        self.ent_text.pack(side=LEFT)

        self.Btn1= Button(self.frame,text='+',width=1,command=self.click_btn1)
        self.Btn1.pack(side=LEFT)
        self.Btn2= Button(self.frame,text='-',width=1,command=self.click_btn2)
        self.Btn2.pack(side=LEFT)
        self.frame2 = ttk.Frame(self.id,borderwidth=1,height=50, width= 200, padding=[2,1])
        self.frame2.pack(side = TOP,anchor=N)
        self.Btn3= Button(self.frame2,text='Enter',width=50,command=self.enter_k)
        self.Btn3.pack(side=TOP)

    def click_btn1(self):
            c = self.ent_text.get()
            self.ent_text.delete(0,END)
            self.ent_text.insert(0, str(int(c)+1))

    def click_btn2(self):
            c = self.ent_text.get()
            if int(c) > 2:
                self.ent_text.delete(0,END)
                self.ent_text.insert(0, str(int(c)-1))

    def enter_k(self):
        self.points = int(self.ent_text.get())
        Main_class(root,560,560).draw()
        
    


class board_can:
    def __init__(self, root, Height, Width,frame,canvas):
        self.id = root
        self.W=Width
        self.H=Height
        self.frame = frame
        self.canvas = canvas
        self.blocks=[]

    def Create(self):
        print('board_can.Create')
        self.frame.pack(side=LEFT, padx=10)
        self.canvas.pack(side=LEFT)
        self.setka_b()
        self.figures(0)
        Menu_fig(self.id).draw_menu()
        self.id.mainloop()


    
    def setka_b(self):
        print('board.can.setka_b')
        self.k=self.H/30
        print('W: ',self.W,'H: ', self.H)
        for i in range(30):
            self.canvas.create_line(0,i*self.k,self.H,i*self.k)
            self.canvas.create_line(i*self.k,0,i*self.k,self.W)

    def figures(self,p):
        self.point = p
        print('board_can.figures')
        self.k=self.H/30
        print(self.canvas)
        for i in range(self.point):
            self.canvas.create_line(0,0,p*100,50)
            print(p)
            rx= random.randint(0,29)
            ry=random.randint(0,29)
            inrx = self.k*rx
            endrx = self.k*rx+ self.k
            inry = self.k*ry
            endry = self.k*ry+ self.k
            self.block = self.canvas.create_rectangle(inrx,inry,endrx,endry,fill='black')
            self.blocks.append(self.block)
            self.id.update()

class Main_class:
    def __init__(self,root,Hight,Width):
        self.id = root
        self.H = Hight
        self.W = Width
        self.frame = ttk.Frame(self.id, borderwidth=1, relief=SOLID)
        self.canvas = Canvas(self.frame, bg="white", width=self.W, height=self.H)
        self.bc = board_can(root,self.H, self.W,self.frame,self.canvas)
        self.bc.Create()
    
    def draw(self,p):
        self.p = p
        self.bc.figures(self.p)


            
    

Main_class(root,560,560)
while True:
    root.update()

Ответы

Ответов пока нет.