1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
1

Что-то я не понимаю.Вызов метода одного класса из другого класса

21.09.2019, 08:28. Показов 6071. Ответов 12
Метки нет (Все метки)

Есть два класса первый содержит атрибуты объекта описывающие кнопку: имя, позиция, размер и тд... А так же содержит набор методов для изменения этих атрибутов. Второй класс содержит атрибуты объекта описывающие список кнопок: список кнопок, фокус. Отношение между объектами типа "имеет", т.е. список кнопок имеет кнопки.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Button:
    def __init__(self, name='кнопка', pos=(0, 0), width=100, height=50, color=(150, 150, 150), text_color=(0, 0, 0),
                 frame_color=(150, 150, 150)):
        self.name = name
        # Координаты
        self.pos = pos
        self.width = width
        self.height = height
        # Поверхность кнопки
        self.surface = pygame.Surface((self.width, self.height))
        self.color = color
        self.frame_color = frame_color
        self.rect = self.surface.get_rect(topleft=self.pos)
        # Надпись
        self.text_color = text_color
        self.font = pygame.font.Font(None, self.height // 2)
        self.surface_text = self.font.render(self.name, 5, self.text_color)
        self.text_rect = self.surface_text.get_rect(center=(self.width // 2, self.height // 2))
 
    def set_name(self, name):
        self.name = name
 
    def set_pos(self, pos):
        self.pos = pos
 
    def set_size(self, width, height):
        self.width = width
        self.height = height
 
    def set_color(self, color=(150, 150, 150)):
        self.color = color
 
    def set_text_color(self, text_color=(0, 0, 0)):
        self.text_color = text_color
 
    def set_frame_color(self, frame_color=(150, 150, 150)):
        self.frame_color = frame_color
 
    def click(self):
        if self.rect.collidepoint(pygame.mouse.get_pos()):
            return True
        else:
            return False
 
    def blit(self, surface: pygame.Surface):
        #   Фон
        self.surface.fill(self.color)
        #   Текст
        self.surface.blit(self.surface_text, self.text_rect)
        #   Рамка
        width = self.width // 100 * 5
        frame = pygame.Rect(0, 0, self.width, self.height)
        pygame.draw.rect(self.surface, self.frame_color, frame, width)
        #   Вставка
        surface.blit(self.surface, self.rect)
 
 
class Bar_button():
    def __init__(self, number=2, pos=(0, 0), orientation='v'):
        self.buttons = []
        for n in range(number):
            self.buttons.append(Button)
            self.buttons[n].set_size(200, 100)
            self.buttons[n].set_name('кнопка ' + str(n))
            
    def blit(self, surface: pygame.Surface):
        Button.blit(surface)
Внимание вопрос! Как правильно написать строки 63, 64, 67? Сейчас PyCarm пишет, что пeрвым параметром ожидается self:Button
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2019, 08:28
Ответы с готовыми решениями:

Вызов метода одного класса внутри другого класса
PHP передача метода, с класса, в другой класс Столкнулся с проблемой не могу передать метод или...

Делегаты или вызов метода класса из другого класса
Добрый день! В попытке изучения c# наткнулся на такую проблему: 1. Зачем нужен делегат? Ведь я...

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void...

PyQt5 вызов метода класса из другого класса
Я создаю свой текстовый редактор. Виджет дерева каталогов я отрисовываю с помощью класса: ...

12
Автоматизируй это!
Эксперт Python
6113 / 3901 / 1084
Регистрация: 30.03.2015
Сообщений: 11,675
Записей в блоге: 29
21.09.2019, 08:40 2
Лучший ответ Сообщение было отмечено miskam как решение

Решение

Цитата Сообщение от miskam Посмотреть сообщение
Внимание вопрос! Как правильно написать строки 63, 64, 67? Сейчас PyCarm пишет, что пeрвым параметром ожидается self:Button
внимание ответ: открываем главу в книге по ООП в пайтон и вдумчиво читаем, основные цели -понять что такое объект, его разницу с классом.
Цитата Сообщение от miskam Посмотреть сообщение
self.buttons.append(Button)
вот тут ты наверное хотел добавить не класс, а его объект, то есть
Python
1
self.buttons.append(Button())
Добавлено через 3 минуты
Цитата Сообщение от miskam Посмотреть сообщение
for n in range(number):
* * * * * * self.buttons.append(Button)
* * * * * * self.buttons[n].set_size(200, 100)
* * * * * * self.buttons[n].set_name('кнопка ' + str(n))
Python
1
2
for n in range(number):
            self.buttons.append(Button(width = 200, height = 100, name ='кнопка ' + str(n)))
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 08:46  [ТС] 3
Точно! Спасибо. Я добавлял объект и про возможность добавления класса я даже не задумывался. А нафига такое может понадобиться? Класс содержащий класс...
Кстати, Blit у меня там не правильно написан надо так:
Python
1
2
3
        
for button in self.buttons:
     button.blit(surface)
0
Автоматизируй это!
Эксперт Python
6113 / 3901 / 1084
Регистрация: 30.03.2015
Сообщений: 11,675
Записей в блоге: 29
21.09.2019, 08:49 4
Цитата Сообщение от miskam Посмотреть сообщение
и про возможность добавления класса я даже не задумывался.
Знаешь главный плюс пайтон? Его гибкость -можно сотней способов решать проблемы, о которых в других языках и не мечтают
А какой главный минус? Его гибкость - можно сотней способов выстрелить себе в ногу
0
1724 / 964 / 198
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
21.09.2019, 10:04 5
Цитата Сообщение от miskam Посмотреть сообщение
А нафига такое может понадобиться? Класс содержащий класс...
Может никогда никому и не понадобится. Но В питоне заложен общий механизм, что метод a_list.append(obj) добавляет в список объект, не ограничивая, что это за объект. А класс в питоне, это тоже объект. Когда Вы пишете просто имя класса, Вы ссылаетесь на объект-класс. Когда же Вы пишете имя класса с круглыми скобками на конце, то создаете новый экземпляр класса.
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 10:05  [ТС] 6
Хотел поупражняться как раз таки в ООП. Кнопки, по-моему, подошли как нельзя лудьше
0
Автоматизируй это!
Эксперт Python
6113 / 3901 / 1084
Регистрация: 30.03.2015
Сообщений: 11,675
Записей в блоге: 29
21.09.2019, 10:06 7
Цитата Сообщение от miskam Посмотреть сообщение
лудьше
1
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 12:38  [ТС] 8
закончил модуль с кнопками. В основном блоке программы импортировал файл модуля.
Python
1
2
3
4
5
6
7
8
import gamebutton
impport pygame
win = pygame.display.set_mode((1500, 900))
start_menu = gamebutton.Bar_button(number=4, orientation='v', pos=(1100, 0))
start_menu.set_all_names(('старт', 'установки', 'карты', 'выход'))
start = gamebutton.Button(name='START', pos=(200, 200))
start.blit(win)
start_menu.blit(win)
Запускаю и получаю ошибку:

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "D:/Документы/Максим/Python/snake.py", line 332, in <module>
start_menu.blit(win)
File "D:\Документы\Максим\Python\gamebutton.py", line 78, in blit
self.buttons[n].blit(surface)
AttributeError: 'str' object has no attribute 'blit'

Process finished with exit code 1

Подскажите в чем ошибка

строка на которую указывает программа 3:
Python
1
2
3
    def blit(self, surface: pygame.Surface):
       for n in range(len(self.buttons)):
           self.buttons[n].blit(surface)
при этом если не импортировать файл, а запускать его непосредственно, то все работает. Так же все работает если вставлять объет Button (т.е. одиночную кнопку)
0
1282 / 667 / 365
Регистрация: 07.01.2019
Сообщений: 2,176
21.09.2019, 13:09 9
Цитата Сообщение от miskam Посмотреть сообщение
закончил модуль с кнопками.
Выложите этот модуль, а то не понятно, что вы там исправляли
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 13:14  [ТС] 10
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import pygame
 
pygame.init()
 
 
class Button:
    def __init__(self, name='кнопка', pos=(0, 0), width=100, height=50, color=(150, 150, 150), text_color=(0, 0, 0),
                 frame_color=(150, 150, 150)):
        self.name = name
        # Координаты
        self.pos = pos
        self.width = width
        self.height = height
        # Поверхность кнопки
        self.surface = pygame.Surface((self.width, self.height))
        self.color = color
        self.frame_color = frame_color
        self.rect = self.surface.get_rect(topleft=self.pos)
        # Надпись
        self.text_color = text_color
        self.font = pygame.font.Font(None, self.height // 2)
        self.surface_text = self.font.render(self.name, 5, self.text_color)
        self.text_rect = self.surface_text.get_rect(center=(self.width // 2, self.height // 2))
 
    def set_name(self, name):
        self.name = name
 
    def set_pos(self, pos):
        self.pos = pos
        self.rect.topleft = self.pos
 
    def set_size(self, width, height):
        self.width = width
        self.height = height
 
    def set_color(self, color=(150, 150, 150)):
        self.color = color
 
    def set_text_color(self, text_color=(0, 0, 0)):
        self.text_color = text_color
 
    def set_frame_color(self, frame_color=(150, 150, 150)):
        self.frame_color = frame_color
 
    def click(self):
        if self.rect.collidepoint(pygame.mouse.get_pos()):
            return True
        else:
            return False
 
    def blit(self, surface: pygame.Surface):
        #   Фон
        self.surface.fill(self.color)
        #   Текст
        self.surface.blit(self.surface_text, self.text_rect)
        #   Рамка
        width = self.width // 100 * 5
        frame = pygame.Rect(0, 0, self.width, self.height)
        pygame.draw.rect(self.surface, self.frame_color, frame, width)
        #   Вставка
        surface.blit(self.surface, self.rect)
 
 
class Bar_button:
    def __init__(self, number=4, pos=(0, 0), orientation='v'):
        self.pos = pos
        self.buttons = []
        self.focus = 0
        for n in range(number):
            self.buttons.append(Button(name='кнопка ' + str(n), width=200, height=100))
            if orientation == 'v':
                self.buttons[n].set_pos(
                    (self.pos[0], self.pos[1] + ((self.buttons[n].height + self.buttons[n].height // 3) * n)))
            elif orientation == 'h':
                self.buttons[n].set_pos(
                    (self.pos[0] + (self.buttons[n].width + self.buttons[n].width // 4) * n, self.pos[1]))
 
    def blit(self, surface: pygame.Surface):
        for n in range(len(self.buttons)):
            self.buttons[n].blit(surface)
 
    def set_all_names(self, names):
        for n in range(len(self.buttons)):
            self.buttons[n] = names[n]
 
 
""""
win = pygame.display.set_mode((800, 600))
start = Button('старт', (200, 100), 200, 100)
setting = Button('установки', (300, 0), 100, 50)
but = Button('О', (300, 200), 400, 200)
bar = Bar_button(number=4, orientation='v')
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONUP:
            if start.click():
                print('Старт')
            elif setting.click():
                print('Установки')
            elif but.click():
                print('QQQ')
                but.set_frame_color((200, 0, 0))
    bar.blit(win)
 #   start.blit(win)
 #   setting.blit(win)
 #   but.blit(win)
    pygame.display.update()"""
0
Автоматизируй это!
Эксперт Python
6113 / 3901 / 1084
Регистрация: 30.03.2015
Сообщений: 11,675
Записей в блоге: 29
21.09.2019, 13:47 11
miskam, а тебе интерпретатор все написал -и что за ошибка и где она
Цитата Сообщение от miskam Посмотреть сообщение
start_menu.set_all_names(('старт', 'установки', 'карты', 'выход'))
идем, смотрим что там происходит в методе

Цитата Сообщение от miskam Посмотреть сообщение
def set_all_names(self, names):
* * * * for n in range(len(self.buttons)):
* * * * * * self.buttons[n] = names[n]
ты каждому элементу баттонс присваиваешь пришедший текст, то есть твои кнопки пропадают, остаются только строки ('старт', 'установки', 'карты', 'выход'), у которых конечно нет метода блит

я когда тебе написал
Цитата Сообщение от Welemir1 Посмотреть сообщение
открываем главу в книге по ООП в пайтон и вдумчиво читаем,
ты какие действия предпринял?
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 13:56  [ТС] 12
Бляяяя!!!! Вот я затупил... не первый раз уже. А главу про ООП уже раза 3 перечитал, один раз даже вдумчиво
1
Автоматизируй это!
Эксперт Python
6113 / 3901 / 1084
Регистрация: 30.03.2015
Сообщений: 11,675
Записей в блоге: 29
21.09.2019, 14:03 13
miskam, ок, не забывай читать до и после еды.
Кроме того, очень прошу тебя ознакомиться вот с этой темой, там для Идеи, но в пичарме все также, это спасет тебе тонны времени и убережет от лишних тем на форуме.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2019, 14:03
Помогаю со студенческими работами здесь

Вызов метода класса Form1 из другого класса
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Вызов метода класса методом другого класса
Есть 2 класса: UControl с классом TControl и UEditor с классом TEditor. Метод класса TControl...

Передача значения переменной из метода одного класса в метод другого класса
Добрый вечер! Есть основная форма Form1 в которой есть метод private void button1_Click(object...

Вызов функции из одного класса кнопкой из другого класса
Доброго времени суток. Помогите разобраться с сигналами и слотами. Уже устал перечитывать не могу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru