Не получается отрисовать элементы python trkinter на холсте с использованием кнопки из другого класса обьектов
Суть в том что хочу реализовать чтобы на холсте 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()
Источник: Stack Overflow на русском