Найти - Пользователи
Полная версия: 'module' object has no attribute 'draw'
Начало » Python для новичков » 'module' object has no attribute 'draw'
1
O_Bannon
Помогите, пожалуйста, совсем начинающему. Несколько дней ковыряюсь, не могу понять в чем проблема. Почему вылетает ошибка callable, почему подчеркивает Ball()?
И в классе Ball есть метод draw, но мне пишет, что ‘module’ object has no attribute ‘draw’ . Спасибо заранее.
 import pygame, sys
import Hello
import Ball
pygame.init()
screen = pygame.display.set_mode((640, 360), 0, 32)
color = (23, 213, 54)
ball = Ball()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    screen.fill(color)
    d = Hello.obj1
    ball.draw()
    pygame.display.update()

 import pygame
from Main import screen
class Ball():
    def __init__(self):
        self.x = 200
        self.radius = 15
        self.y = 50
        self.color = (12, 35, 67)
    def draw(self):
        pygame.draw.circle(screen, self.color, (self.x, self.y), self.radius)

Почему в Ball есть draw, а он мне пишет, что нет его?
Как мне просто создать объект в классе Main из другого класса?
ZerG
1. import Ball => from <file_name> import Ball
2.
if __name__ == “__main__”:
pass

3. from Main import screen - в трейсе проверьте импортируется ли !!!
JOHN_16
O_Bannon
посмотрите внимательно что Вам пишет интерпретатор и что вы делаете:
O_Bannon
‘module’ object has no attribute ‘draw’
O_Bannon
'module’ object
и
O_Bannon
import Ball
Вы импортируете не класс определенный в модуле, а модуль в котором есть класс. Сделайте
from Ball import Ball
O_Bannon
Cannot import name Ball.
Может я рано начал такие вещи экспериментировать, но просто хотелось бы быстрее понять логику питоновскую.
 import pygame, sys
import Hello
from Ball import Ball
pygame.init()
screen = pygame.display.set_mode((640, 360), 0, 32)
color = (23, 213, 54)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    screen.fill(color)
    d = Hello.obj1
    ball = Ball.draw
    pygame.display.update()

 import pygame
from Main import screen
class Ball:
    def __init__(self):
        self.x = 200
        self.radius = 30
        self.y = 150
    def draw(self):
        pygame.draw.circle(screen, (12, 44, 56), (self.x, self.y), self.radius)
ball = Ball()

Hello там от другого класса. И при том работает, а просто круг нарисовать не получается по той же логике.

 class Hello:
    def __init__(self, x,y):
        self.a = x
        self.b = y
obj1 = Hello("hello","world")
print (obj1.a, obj1.b)
Я уже все перепробовал и читать мануалы, ну там не пишут ведь, как из другого файла создать объект.
И, тогда, я не понимаю, почему import Hello получилось, а здесь необходимо from Ball import Ball
JOHN_16
Во первых, Вы молодец что стараетесь - это видно.
Во вторых, у вас ошибки в коде связанные пока что с недостатком знаний в разных областях программирования. Причем как со знанием самого Питона, так и с архитектурой построения приложений.
Я исправил Ваш код что бы он стал рабочим. Смотрите внимательной:
Структура проекта
 (pgtest) john_16@Linux-home /tmp/pgtest $ ll *.py
-rw-r--r-- 1 john_16 john_16 262 янв  6 16:00 ball.py
-rw-r--r-- 1 john_16 john_16 363 янв  6 16:02 main.py
Содержание файлов:
 (pgtest) john_16@Linux-home /tmp/pgtest $ cat ball.py 
import pygame
class Ball:
    def __init__(self, screen):
        self.x = 200
        self.radius = 30
        self.y = 150
        self.screen = screen
    def draw(self):
        pygame.draw.circle(self.screen, (12, 44, 56), (self.x, self.y), self.radius)
(pgtest) john_16@Linux-home /tmp/pgtest $ cat main.py 
import pygame
import sys
from ball import Ball
pygame.init()
screen = pygame.display.set_mode((640, 360), 0, 32)
color = (23, 213, 54)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    screen.fill(color)
    ball = Ball(screen)
    ball.draw()
    pygame.display.update()
Если вы вызовете на исполнение основной файл main.py - то на экране нарисуется круг.
Я не буду оставлять комментарии сейчас, изучите код внимательно и когда у вас появятся вопросы, четко сформулируйте их и мы Вам поможем.
O_Bannon
Спасибо, получилось. Интересно еще то, что если оставить “from Main import screen” в Ball, он выдает ошибку. Казалось бы, почему бы просто не проигнорировать. А так получилось всё.
vic57
O_Bannon
почему бы просто не проигнорировать
ты импортируешь screen, когда он еще не создан
pygame->screen->объект screen

JOHN_16
Ошибки нельзя игнорировать, потому что это может вызвать не предсказуемые действия программы. Представьте что из за проигнорированных ошибок Ваша программа неожиданно удалила не 1 временный файл, а тысячу нужных. Не хотелось бы такого, не правда ли? это был риторический вопрос
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB