В Qt Designer сделал кнопку выбора файла, но не могу использовать путь к этому файлу

brazzzas2018

Новичок
Пользователь
Апр 8, 2020
5
1
3
Добрый день,

питон 3.7, Qt5, Windows 10.

В общем история такая: я новичок в питоне и хочу сделать небольшое приложение, в котором я бы выбирал базу Access на компьютере, а дальше код доставал бы оттуда данные и вертел бы их в pandas.

В PyCharm у меня есть два файла питон: в одном написано приложение с помощью Qt Designer (podgotovka.py), в другом стоит код, который берет данные из Access (yty_analysis) и преобразует их и сохраняет в эксель.

В первом файле я сделал кнопку, которая открывает диалоговое окно, я выбираю базу Аксесс, но не могу нормально сохранить переменную с путем к этой базе, чтобы импортировать этот путь во второй файл с pandas, чтобы дать знать ему куда идти.

Вот ниже код:

Python:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog

import Order

class Ui_MainWindow(QtWidgets.QMainWindow, Order.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.pressed.connect(self.yty_report)
        self.select_base.clicked.connect(self.select_access)

def yty_report(self):
        import YtY_analysis
        YtY_analysis.func111(YtY_analysis.data5)

    def select_access(self):
        print('pressed')
        self.open_dialog_box()

    def open_dialog_box(self):
        global path
        filename = QFileDialog.getOpenFileName()
        path = filename[0]
        return path

app = QtWidgets.QApplication([])
window = Ui_MainWindow()
print(window.path)
if __name__== "__main__":
    window.show()
    app.exec_()

Вот здесь в функции def open_dialog_box(self): я получаю переменную path. И она содержит ровно путь, который мне нужен. Но я не могу его вывести куда-то и импортировать в файл yty_analysis.

Помогите, пожалуйста.
 
  • Мне нравится
Реакции: Mut3x

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В примере путь также сохраняется в переменную self.path. Оттуда он доступен для любой функции. Например:
Python:
def yty_report(self):
    import YtY_analysis
    YtY_analysis.func111(self.path)
Взял для примера функцию из вашего кода, хотя лучше делать import вне функций.
Python:
from YtY_analysis import func111

...
def yty_report(self):
    func111(self.path)
    
...
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример вывода пути из диалога в поле:
Python:
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QLineEdit, QFileDialog


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName('MainWindow')
        MainWindow.resize(235, 180)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName('centralwidget')
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName('pushButton')
        self.line1 = QLineEdit(self.centralwidget)
        self.line1.resize(200, 32)
        self.line1.move(0, 50)
        self.path = None
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)

    def open_dialog_box(self):
        filename = QFileDialog.getOpenFileName()
        self.path = filename[0]
        self.line1.setText(self.path)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate('MainWindow', 'MainWindow'))
        self.pushButton.setText(_translate('MainWindow', 'button'))
        self.pushButton.clicked.connect(self.open_dialog_box)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Зачем вам в этом файле путь из другого? Вы импортируйте этот файл (или функцию из него) в другой (podgotovka.py) и там дальше с ним работайте.
В первом файле нужно просто написать функцию, которая принимает файл и возвращает результат запроса к базе.
Python:
# Добавляем таблицу журнал продаж из Access
def access_database(path):
    cnxn = pyodbc.connect(r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + path)
    cursor = cnxn.cursor()
    cursor.execute("SELECT * FROM Журнал_продаж")
    rows = cursor.fetchall()
    cursor.close()
    cnxn.close()
    return rows
Во втором файле импортируйте функцию и используйте:
Python:
import YtY_analysis
from YtY_analysis import access_database

...
def yty_report(self):
    data = access_database(self.path)
    self.line1.setText(data[0])
 
  • Мне нравится
Реакции: brazzzas2018

brazzzas2018

Новичок
Пользователь
Апр 8, 2020
5
1
3
Спасибо большое,
Зачем вам в этом файле путь из другого? Вы импортируйте этот файл (или функцию из него) в другой (podgotovka.py) и там дальше с ним работайте.
В первом файле нужно просто написать функцию, которая принимает файл и возвращает результат запроса к базе.
Python:
# Добавляем таблицу журнал продаж из Access
def access_database(path):
    cnxn = pyodbc.connect(r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + path)
    cursor = cnxn.cursor()
    cursor.execute("SELECT * FROM Журнал_продаж")
    rows = cursor.fetchall()
    cursor.close()
    cnxn.close()
    return rows
Во втором файле импортируйте функцию и используйте:
Python:
import YtY_analysis
from YtY_analysis import access_database

...
def yty_report(self):
    data = access_database(self.path)
    self.line1.setText(data[0])
Спасибо большое, очень похоже на решение проблемы, над которой я думал не один день) Спасибо и за то что быстро и подробно)
 

brazzzas2018

Новичок
Пользователь
Апр 8, 2020
5
1
3
Вот пример вывода пути из диалога в поле:
Python:
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QLineEdit, QFileDialog


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName('MainWindow')
        MainWindow.resize(235, 180)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName('centralwidget')
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName('pushButton')
        self.line1 = QLineEdit(self.centralwidget)
        self.line1.resize(200, 32)
        self.line1.move(0, 50)
        self.path = None
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)

    def open_dialog_box(self):
        filename = QFileDialog.getOpenFileName()
        self.path = filename[0]
        self.line1.setText(self.path)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate('MainWindow', 'MainWindow'))
        self.pushButton.setText(_translate('MainWindow', 'button'))
        self.pushButton.clicked.connect(self.open_dialog_box)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

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

brazzzas2018

Новичок
Пользователь
Апр 8, 2020
5
1
3
В примере путь также сохраняется в переменную self.path. Оттуда он доступен для любой функции. Например:
Python:
def yty_report(self):
    import YtY_analysis
    YtY_analysis.func111(self.path)
Взял для примера функцию из вашего кода, хотя лучше делать import вне функций.
Python:
from YtY_analysis import func111

...
def yty_report(self):
    func111(self.path)
   
...
Спасибо, сейчас попробую. Где-то прочитал, что если два файла ссылаются друг на друга, то лучше импортировать в функцию.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В функцию лучше импортировать когда импортируется большой модуль (файл), а используется в основной программе он не постоянно (редко). Тогда это оправдано, так как будет уменьшать скорость загрузки скрипта.
 

brazzzas2018

Новичок
Пользователь
Апр 8, 2020
5
1
3
В функцию лучше импортировать когда импортируется большой модуль (файл), а используется в основной программе он не постоянно (редко). Тогда это оправдано, так как будет уменьшать скорость загрузки скрипта.

Вот ниже код в yty_analysis.py. Здесь мне нужен путь из того файла. Я же не могу здесь писать self.path? Так как self - относится к path. Как я должен тогда написать?

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


Python:
import pandas as pd
import pyodbc



# Добавляем таблицу журнал продаж из Access
def access_database():
    import podgotovka
    return podgotovka.window.path
fileSpec = access_database()
print(fileSpec)
    #r"C:\Users\Kozhin\Desktop\новая база1.accdb"
access_database()
cnxn = pyodbc.connect(r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + fileSpec)

cursor = cnxn.cursor()
cursor.execute("SELECT * FROM Журнал_продаж")
 

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
@brazzzas2018 Не забудь выбрать ответ @stud_55 как самый лучший. Нажми на иконку трофея рядом с ответом.
answer0icon.png
 

Форум IT Специалистов