Найти - Пользователи
Полная версия: Как правильно связать классы с разных файлов
Начало » Python для новичков » Как правильно связать классы с разных файлов
1 2 3
Novator
Привет всем!
Сильно не пинайте, но я действительно не могу понять общий принцип.
Ранее на Autoit было просто - импортировал файл, и все с него можно использовать, а вот с python я теряюсь.
Но - к вопросу.
Итак, есть три файла с расширением py.
1. design.py - Дизайн, созданный и конвертированный из QTDesigner
2. main.py - собственно главный исполняющий файл, в который я и хочу все добавить.
Эти два файла между собой связаны и прекрасно работают. Это просто для показа связи
 import sys
from PyQt5 import QtWidgets, QtGui, QtCore
import design
from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout, QVBoxLayout, QFrame)
from PyQt5.QtGui import QColor
from PyQt5.QtCore import QSize
##Главный класс
class App(QtWidgets.QMainWindow, design.Ui_MainWindow):
##	Инициализация окна и обработчики событий
	def __init__(self):
		# Это здесь нужно для доступа к переменным, методам
		# и т.д. в файле design.py
		super().__init__()
		self.setupUi(self)
                -----------------------
То есть в файле main.py у меня один класс, связанный чисто с обработкой функций окна
И третий файл - kod.py, в котором планируется основная логика ну и вывод конечного результата в окно
Подключаю его к main.py так:
 from kod import Kod
Kod - это название класса в файле kod.py
В функции инициализации главного файла прописываю обработку функции с файла kod.py:
 self.btn_Parce.clicked.connect(Kod.open_import_txt)
Там просто вывод сообщения в консоль, все нормально.
Но вот суть вопроса - как с файла kod.py обратиться к элементам окна (design.py и main.py). Да, в main.py есть дополнительно созданные элементы
Читал про инициализацию класса. Дальше этого в файле kod.py не прошел:
 class Kod():
	def __init__(self):
		super().__init__()
Пробовал еще по примеру с первого файла дописать это:
 self.setupUi(self)
Получаю ошибку
Я так понял, эти строки вроде должны были позволить иметь связь с файлом интерфейса.
Как наладить эту пресловутую связь в обоих направлениях?
Чтобы я с одного файла обращался к функциям второго, а со второго - к элементам управления первого.
Спасибо за внимание
py.user.next
Novator
Итак, есть три файла с расширением py.
1. Design.py - Дизайн, созданный и конвертированный из QTDesigner
2. Main.py - собственно главный исполняющий файл, в который я и хочу все добавить.
Файлы называй всегда строчными буквами. С прописной буквы называются классы. Это соглашение из PEP8.

А то ты потом напишешь Kod.open_import_txt , например, и будет непонятно, это модуль Kod c функцией open_import_txt или это класс Kod с методом open_import_txt .
Так что соблюдай соглашение, чтобы другие по всему твоему коду не лазили и не искали, что такое Kod. Никто это делать не будет, просто выкинут твой код через пару таких поисков.

Если же ты решил сумничать и файлы, которые у тебя называются design.py и main.py , назвал с больших букв потому, что они начинают новое предложение в русском языке, то ты ещё хуже сделал. Мы как догадаемся, что у тебя файлы называются правильно? Так что пиши точно всё всегда, чтобы не тратить время на допольнительные расспросы.

Так что всё переименуй, всё переделай, отредактируй сообщение на форуме, а потом задавай свой вопрос. Потому что мне надоело по твоему коду лазить и думать “а как у него файлы называются?”.
Novator
py.user.next
ну ветка для новичков, потому ваши язвительные замечания о моем уме я пропущу.
Сообщение отредактировано
PEHDOM
Novator это у него нормальная манера ведения беседы, если не обращать внимание на эмоциональную часть, то зачастую он дает вполне дельные советы.
Novator
PEHDOM, я понимаю и смиренно склоняю голову…
Сам знаю, когда приходиться объяснять элементарные вещи и как это бесит.
Ну просто для меня этот вопрос пока не элементарный
xam1816
Novator
Ну просто для меня этот вопрос пока не элементарный
Можете представить код так:любое имя переменной,функции или класса= названию адреса пространства в котором хранится какое-то значение или другое пространство.К примеру у вас есть квартира-это ваше пространство,а вы это пространство находящееся в этом пространстве.,хранящее значение в виде себя.Если я нахожусь рядом с вами в одной квартире,то могу передать вам письмо с информацией сразу в руки.просто обратившись к вам по имени,например Иван.Но если я нахожусь в другом городе,то чтобы передать вам письмо мне нужно точно знать ваш адрес.т.е.Город.Улица.Дом.Квартира.Иван.Конечно в программировании я не встречал столько вложенных пространств.,в коде будет обращение Класс.переменная.В итоге чтобы можно было обращаться из одного пространства в другое,нужно чтобы пространство знало адрес другого пространства.
Написав import my_lib ,теперь все будут знать адрес этого пространства,и будут обращаться через точку,к примеру my_lib.Class().variable.Если вы укажете не существующий адрес, то будет ошибка.Если не укажете import,то никто не узнает адреса пространства..Слишком мудрено конечно,но я представляю это так
py.user.next
Novator
Но вот суть вопроса - как с файла kod.py обратиться к элементам окна (design.py и main.py).
Из файла kod.py ты максимум можешь послать сигнал. Этот сигнал должен слушать класс приложения из файла main.py и реагировать на него, выполняя какое-то действие при его получении. Вся связь между частями в Qt-приложениях организуется через сигналы и слоты.

Модуль залазить в модуль не должен. Модуль на то и модуль, что он закрыт и независим от других модулей, не знает их содержимого, прячет своё содержимое от них и предоставляет лишь интерфейс наружу для взаимодействия с ним. Например, ты берёшь флешку, ты не знаешь что там у неё внутри, ты можешь только подключить её к компьютеру. У компьютера есть интерфейс USB и у флешки есть интерфейс USB. Компьютер не знает, что там внутри у флешки, а флешка не знает, что там внутри у компьютера. Вот благодаря этому флешки можно подключать не только к компьютеру, а к компьютеру можно подключать не только флешки. Работает лишь интерфейс, по которому туда-сюда что-то передаётся. В этом и состоит модульность. Такая же модульность у модулей питона.

Поэтому создай отдельный файл с интерфейсами. Там у тебя будет описан сигнал. Потом этот сигнал импортируешь в kod.py и в main.py и дальше в main.py ты в приложении App делаешь слот, который принимает этот сигнал и что-то делает при его получении. А в kod.py ты посылаешь этот сигнал через emit куда-то в общее пространство. И вот так через общее пространство, где ходят все сигналы приложения, этот сигнал попадёт в слот и тот на него среагирует. Таким образом, у тебя модуль kod.py не будет знать про модуль main.py . Таким образом, у тебя модуль main.py не будет знать про модуль kod.py . А про содержимое друг у друга они не будут знать тем более. Они будут только через интерфейс общаться в виде этого сигнала или нескольких сигналов. А сигнал ты делаешь самодельный.
Novator
Из всего написанного я так понимаю, что к делу относятся только сигналы и слоты. Что ж, по этим словам и будем гуглить
Хотя смотрю, что проще или не делать вообще, или писать все в один файл и класс

py.user.next
Поэтому создай отдельный файл с интерфейсами. Там у тебя будет описан сигнал. Потом этот сигнал импортируешь в kod.py и в main.py и дальше в main.py ты в приложении App делаешь слот, который принимает этот сигнал и что-то делает при его получении. А в kod.py ты посылаешь этот сигнал через emit куда-то в общее пространство. И вот так через общее пространство, где ходят все сигналы приложения, этот сигнал попадёт в слот и тот на него среагирует.
А можно пару строк кода?
py.user.next
Novator
Хотя смотрю, что проще или не делать вообще, или писать все в один файл и класс
Вся связь между частями программы, использующей Qt, делается через сигналы и слоты.
Novator
Что ж, по этим словам и будем гуглить
Для начала узнай, что такое coupling и cohesion.
https://en.wikipedia.org/wiki/Coupling_(computer_programming)
https://en.wikipedia.org/wiki/Cohesion_(computer_science)

Потому что не знаешь ты именно это. Соответственно, и в модуль из другого модуля ты лезешь потому, что вот этого всего не знаешь. Что там в Qt, неважно. Qt - это одна какая-то там библиотека. А эти понятия работают для всех библиотек во всех языках во все времена и так далее. Это теория программирования.

Соответственно, ты разбиваешь программу на модули - ну, разбивай. Но это не значит, что эти модули должны друг в друга лазить. Это нарушение вот этих фундаментальных правил, которое вылезет в хорошо известных последствиях.
Novator
py.user.next, опять замечание на мои умственные возможности. С таким количеством сообщений конечно имеете право. Но право блеснуть знаниями, а не указывать на неграмотность других.
Если бы я знал ответы на все вопросы, меня бы тут и не было
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