Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
38 / 37 / 26
Регистрация: 05.01.2018
Сообщений: 269
1

Связь между файлами python

19.08.2020, 13:03. Показов 2681. Ответов 15
Метки нет (Все метки)

Добрый день. Есть два файла питон. Один из них - это основной код, функциональная часть программы, второй - представляет собой визуальную часть, модульное окно, куда вводятся данные. Пользователь вводит данные в окно, при нажатии клавиши OK, запускается первый файл, затем необходимая информация передается из второго файла в соответствующие переменные первого, код выполняется. Как организовать подобную связь и где можно почитать об этом? Вариант объединить файлы в один не подходит.
Связь между файлами python
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2020, 13:03
Ответы с готовыми решениями:

Связь Python + C(C++)
Добрый день. Есть задание написать небольшую игрушку. Вся фишка в том, чтобы оболочка была написана...

Связь python и sql
Есть ли связь? Добавлено через 3 минуты CREATE TABLE NEW ( inn numeric(20), naimen...

Связь Python c Django
Заранее прошу сильно не пинать, если такая тему уже есть на форуме пожалуйста дайте ссылку -сам не...

Связь Python and LUA JSON передача
Здравствуйте. Я пытаюсь связать телеграмм бота и игру. Мне нужно написанные сообщения боту...

15
1190 / 783 / 389
Регистрация: 12.03.2018
Сообщений: 2,231
19.08.2020, 13:07 2
Что мешает в файл А импортировать функцию из файла Б.
При нажатии на ОК (gui файл А), вызвать эту функцию.
p.s.: функции могут что-то принимать и возвращать
1
1315 / 782 / 174
Регистрация: 22.02.2018
Сообщений: 2,218
Записей в блоге: 3
19.08.2020, 19:38 3
Aleksandrw, Импортируете модуль "Б". Вызов формы модуля "Б" должна осуществляться из сценария "А".
Данные введенные в форму модуля "Б" должны сохраняться в глобальных переменных модуля "Б". Так как запуск формы осуществляется из сценария "А", то после закрытия формы управление вернется в сценарий "А". И Вы считываете значения глобальных переменных из модуля "Б", обращаясь к ним как к квалифицированным переменным <modul>.<variable> , которые являются данными введенными в форму.
1
4 / 3 / 1
Регистрация: 17.08.2020
Сообщений: 48
19.08.2020, 20:00 4
Импортим всё в файл с GUI
Python
1
from b import *
и смотря что за GUIмодуль соединяем как того требует нужды и модуль GUI
1
1315 / 782 / 174
Регистрация: 22.02.2018
Сообщений: 2,218
Записей в блоге: 3
19.08.2020, 20:20 5
Цитата Сообщение от dail45 Посмотреть сообщение
Импортим всё в файл с GUI
Тогда файл с формой становится основным запускаемым файлом. Но как я понимаю, это не то, что нужно ТС.

Добавлено через 7 минут
Цитата Сообщение от dail45 Посмотреть сообщение
from b import *
Это действие импортирует из "b" , что противоречит рекомендации строчкой выше
Цитата Сообщение от dail45 Посмотреть сообщение
Импортим всё в файл с GUI
импортировать все в "b".
1
Эксперт Python
4485 / 3270 / 1057
Регистрация: 28.10.2013
Сообщений: 8,406
Записей в блоге: 1
19.08.2020, 20:21 6
Цитата Сообщение от dail45 Посмотреть сообщение
Импортим всё в файл с GUI
Добрый совет... для написания говнокода. Так никогда не нужно делать, кроме случаев быстрого тестирования какого-нибудь модуля.

И не надо никаких глобальных переменных.
Ни первый, ни второй файл главными не являются. Они должны быть оформлены как библиотеки с классами. По крайней мере интерфейсный модуль.
Главный модуль main.py(или .pyw) будет импортировать нужную функциональность и из первого и второго и пользоваться ей в меру необходимости.
1
1315 / 782 / 174
Регистрация: 22.02.2018
Сообщений: 2,218
Записей в блоге: 3
19.08.2020, 20:33 7
Цитата Сообщение от Garry Galler Посмотреть сообщение
Главный модуль main.py(или .pyw) будет импортировать нужную функциональность и из первого и второго и пользоваться ей в меру необходимости.
Можно конечно и так, но это имеет смысл, когда вы и первый модуль вероятно будете использовать где то в качестве подгружаемого модуля. Но если нет, то какой смысл импортировать его куда то. Что касается глобальных переменных, то можно конечно и другие варианты передачи данных в вызывающий файл. Но нужно только продумать где их сохранить, что бы потом забрать их вызывающей программой. Я у себя в программе например сохраняю данные введенные в форму в базе данных. И потом основная программа забирает их оттуда.
1
Эксперт Python
4485 / 3270 / 1057
Регистрация: 28.10.2013
Сообщений: 8,406
Записей в блоге: 1
19.08.2020, 21:12 8
Цитата Сообщение от Viktorrus Посмотреть сообщение
у себя в программе например сохраняю данные введенные в форму в базе данных.
Это не имеет отношение к проблематике хранения состояния в глобальных переменных.
Данные сохраняются в БД не по причине их глобальности, а по необходимости персистентного хранения какого-то состояния.

Цитата Сообщение от Viktorrus Посмотреть сообщение
это имеет смысл, когда вы и первый модуль вероятно будете использовать где то в качестве подгружаемого модуля.
Именно это и должен сделать ТС: оформить этот модуль как контейнер с магией. Когда ему понадобится какая-то магия оттуда, он вызывает черный ящик (модуль) и говорит "хочу шляпу с кроликом" и модуль дает ему это.
А главный модуль должен заботиться исключительно о создании экземпляра программы, логике его запуска и завершения. Вся магия должна быть за кулисами.
1
1315 / 782 / 174
Регистрация: 22.02.2018
Сообщений: 2,218
Записей в блоге: 3
19.08.2020, 22:14 9
Лучший ответ Сообщение было отмечено Aleksandrw как решение

Решение

Garry Galler, И все таки Вы не ответили ТСу на его вопрос, как передать данные введенные в форму в главный модуль, пусть он будет как Вы предлагаете main.py (или main.pyw). Я предложил запустив в интерфейсном модуле функцию сохранить данные в глобальных переменных этого интерфейсного модуля. Затем главным модулем можно будет их забрать используя квалифицированные имена. Можно конечно при импорте использовать from но в этом случае возникает риск конфликта имен. Но даже пусть используется from , все равно, как забрать данные из формы. Как только закроем форму, так данные пропадут. То есть сохранить данные мы можем только запуская функцию из под формы. Но эта функция будет принадлежать интерфейсному модулю и сохранять внутри функции мы не можем, так как при ее отработки ее содержимое пропадет. Если мы будем запускать эту функцию из главного модуля то форма уже будет закрыта и потому функция ничего не вернет.
Хотя сейчас придумал вариант.
Из главного модуля запускать функцию в интерфейсном модуле которая в свою очередь запускает форму , затем сохраняет в локальных переменных данные . После закрывает форму и возвращает данные в главный модуль, который ее вызвал. Пожалуй так сработает.

Добавлено через 1 минуту
Пожалуй запомню такую технологию и буду ее применять.
1
Эксперт Python
4485 / 3270 / 1057
Регистрация: 28.10.2013
Сообщений: 8,406
Записей в блоге: 1
19.08.2020, 23:17 10
Цитата Сообщение от Viktorrus Посмотреть сообщение
И все таки Вы не ответили ТСу на его вопрос,
Как я ему отвечу, если я не вижу ни строчки кода? Все что мы сейчас ему советуем это "разговоры в пользу бедных".
Но ТС сам виноват: что спросил, то и ответили.

Цитата Сообщение от Viktorrus Посмотреть сообщение
Как только закроем форму, так данные пропадут.
Да ничего никуда не пропадает. GUI класс ничем не отличается от любого другого класса.
Как из одного класса можно передать состояние любому другому, так и здесь.
1
38 / 37 / 26
Регистрация: 05.01.2018
Сообщений: 269
20.08.2020, 12:50  [ТС] 11
Всем спасибо за ответы, понял, в каком направлении копать. Garry Galler, Viktorrus, вариант с записью значений переменных в текстовый файл, а затем, при запуске основного кода, брать их оттуда, стоит рассмотрения? Мне все равно нужно сохранять где-то значения переменных для будущих сессий - если пользователь ставит галочку - при следующем запуске программы, поля автоматически заполняются.
Связь между файлами python
0
Эксперт Python
4485 / 3270 / 1057
Регистрация: 28.10.2013
Сообщений: 8,406
Записей в блоге: 1
20.08.2020, 13:45 12
Цитата Сообщение от Aleksandrw Посмотреть сообщение
вариант с записью значений переменных в текстовый файл
Обычно для небольшого числа переменных, чьи значения нужно сохранять для последующего запуска программы вполне приемлемо использовать ini файл.
В Python работа с ini файлами встроена в стандартную библиотеку. Однако, сам модуль оставляет желать лучшего (есть баги, типа стирания комментариев после перезаписи файла). Да и формат ini уже несколько устарел.
Можно попробовать рассмотреть более мощный формат toml (сам сейчас им пользуюсь в Go), для Python парсеры toml тоже можно найти на pypi.
2
38 / 37 / 26
Регистрация: 05.01.2018
Сообщений: 269
20.08.2020, 13:50  [ТС] 13
Garry Galler, хорошо, спасибо.
0
1315 / 782 / 174
Регистрация: 22.02.2018
Сообщений: 2,218
Записей в блоге: 3
20.08.2020, 14:43 14
Aleksandrw, Советую еще посмотреть встроенный в питон модуль shelve. Я использую его для сохранения данных. Основное его достоинство, с ним очень удобно работать. Сохраненные данные имеют структуру словаря питона, и кроме того, что они сохраняются на диске и поэтому перед началом работы нужно выполнить загрузку, а по окончании закрыть, в остальном Вы работаете с ним как с обычным словарем питона. Все методы и операции, которые доступны словарям питона, доступны и этому словарю.
То есть Вы получаете словарь питона, который можете сохранять на диске, и при необходимости загружать его для работы.
Да и чуть не забыл, в отличие от текстовых файлов и некоторых других средств, в этом словаре , как и в любом другом словаре питона, можно сохранять любые объекты питона и вложенные структуры питона, в том числе экземпляры класса. Это благодаря тому, что модуль shelve использует в своей работе модуль pickle , с помощью которого можно сохранять на диске любой объект питона. Но модуль shelve предоставляет более удобный сервис для работы с ним, как я описал выше.

Добавлено через 7 минут
Модуль shelve фактически называется в питоне средством для создания баз данных, в которых Вы можете осуществлять поиск нужной Вам информации.

Добавлено через 9 минут
Aleksandrw, Пример аналогичный Вашей задаче подробно рассматривается в книге
Лутц М. Программирование на Python. Том 1 (4-е издание, 2011) Глава 1. Там где рассказывается как использовать графический интерфейс и сохранять данные с помощью модуля shelve в базе данных.

Добавлено через 3 минуты
Для Вашей задачи shelve может оказаться излишне мощным инструментом, но стоит научиться с ним работать.
1
38 / 37 / 26
Регистрация: 05.01.2018
Сообщений: 269
20.08.2020, 16:57  [ТС] 15
Viktorrus, хорошо, большое спасибо за информацию. Есть над чем поработать
0
1315 / 782 / 174
Регистрация: 22.02.2018
Сообщений: 2,218
Записей в блоге: 3
22.08.2020, 16:08 16
Aleksandrw, Вот я наклепал небольшой примерчик показывающей как передать данные из главного сценария в модуль и передать из модуля в главный сценарий вновь введенные данные с помощью функции и используя модуль shelve. Данные представил как некоторый объект, являющийся экземпляром класса Data. Это облегчит использовать пример и для других задач.
Файл с главным сценарием:
Кликните здесь для просмотра всего текста
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
""" Создаем программу обрабатывающую некоторые данные. 
Задача: Получить в сценарий (главный модуль) данные, 
которые должны вводится с помощью специальной формы, 
размещенной в отдельном модуле, из которого они забираются
в основной сценарий. 
В данном случае используется технология модульного программирования.
В основном сценарии мы передаем во спомогательный модуль 
значения операндов по умолчанию, и получаем из него
введенные с помощью формы
данные для для их обработки в основном сценарии.
Так как в условии данной задачи основным объектом,
с которым мы должны работать, является массив данных, 
которые необходимо передать из модуля в сценарий, 
то определим класс вводимых данных (класс входных данных для обработки).
"""
 
import module2 as _form
 
class Data:
    def __init__(self, a=0, b=1):
        self.a = a
        self.b = b
 
        # Свойствами объекта "Входные данные" 
        # (экземпляра класса Data) являются
        # собственно операнды для обработки a и b .
 
if __name__ == '__main__':
    data = Data()
    a, b = _form.inputData(data)
    c = a / b
    print(c)

И размещенный в этом же каталоге файл module2 :
Кликните здесь для просмотра всего текста
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
from tkinter import *
import shelve
shelvename = 'storage'
fieldnames = ('a', 'b')
 
def makeWidgets():
    global entries
    window = Tk()
    window.title('Вычисление')
    window.geometry('360x200+0+0')
    form = Frame(window)
    form.pack()
    entries = {}
    for (ix, label) in enumerate(fieldnames):
        lab = Label(form, text=label)
        ent = Entry(form)
        lab.grid(row=ix, column=0)
        ent.grid(row=ix, column=1)
        entries[label] = ent
    Button(window, text="Сохранить", command=updateRecord).pack(side=LEFT)          # кнопка Сохранить
    Button(window, text="Выход", command=lambda :window.destroy()).pack(side=RIGHT)
    return window
 
def inputData(data):
    window = makeWidgets()          # создание формы
    for field in fieldnames:
        entries[field].insert(0, getattr(data, field)) # для каждого поля заполняется виджет Entry
    window.mainloop()               # передача управления форме
    db = shelve.open('storage')
    a = db['a']
    b = db['b']
    db.close()
    return a, b
 
def updateRecord():
    a = int(entries['a'].get())
    b = int(entries['b'].get())
    db = shelve.open('storage')
    db['a'] = a
    db['b'] = b
    db.close()

Алгоритм работы программы следующий:
Создается объект с данными по умолчанию. Этот объект с данными в качестве аргумента функции передается в интерфейсный модуль, который формирует форму используя эти данные из объекта data.
Затем мы вводим в форму новые данные и сохраняем их в базе данных модуля shelve.
Дальше выходим из формы и данные берутся из базы данных и функция с помощью return передает введенные данные в главный сценарий, где происходит их обработка. Затем, что бы протестировать правильность работы программы, результат выводится в консоль.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2020, 16:08

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Связь между файлами
Добрый день. Проблема состоит в следующем. Пользовался 2010 офисом и при копировании папки с...

Связь между разными файлами\книгами. Для начинающих
Всем привет. Не знаю, как сформулировать вопрос, поэтому опишу задачу, если кто поможет, спасибо...

Как удалить связь между 2-мя разными файлами в аксессе
помогите пожалуйста, заранее извините за грамматику , я не русский и попытаюсь написать о проблеме...

Создать любые две таблицы, установить между ними связь, и с помощью запроса показать эту связь
Короче такое задание. Создать любые две таблицы, установить между ними связь и с помощью запроса...

Связь проги с файлами
Пишу мп3 плеер. Как заставить винду открывать музыку и плейлисты этим плеером (а не winamp-ом)....

Работа с файлами. связь многие ко многим
Подскажите, пожалуйста. есть 3 файла: &quot;Заказ&quot;(код заказа,название продукта, код продукта),...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.