Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 16.03.2020
Сообщений: 57

Вызов функции из потока в другом файле

16.03.2020, 23:20. Показов 1647. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите начинающему.

Я создал класс class ExampleA(QMainWindow) и написал функцию, которая автоматически открывает файл эксель, считывает его в память и определяет количество заполненных строк на первой странице. Если файл эксель отсутствует, то ПОЯВЛЯЕТСЯ ДИАЛОГОВОЕ ОКНО с предложением указать путь к файлу. Если пользователь не хочет указывать путь, то он закрывает это окно и функция возвращает "Exit".

Программа работает, но как сделать так, чтоб можно было вызывать эту функцию из другого файла? Особенно из отдельного потока? И чтоб при завершении работы функции, главная программа не прекращала работу? Функция должна передать значения в поток.

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
import sys, openpyxl
from PyQt5.QtWidgets import (QMainWindow, QFileDialog, QMessageBox, QApplication,)
 
class ExampleA(QMainWindow):
 
    def __init__(self):
        super().__init__()
        #self.show()
        self.initUI()
 
    def initUI(self):
        self.BOOK, self.N, self.wb_obj = self.OpenBook()
        print(self.N)
        sys.exit()
 
    def OpenBook(self):  # Функция возвращает таблицу эксель и количество строк таблицы
        self.path = "AAA.xlsx"
        self.BOOK = 'error'  # Проверка успешного открытия книги
        while self.BOOK == 'error':
            try:
                self.wb_obj = openpyxl.load_workbook(self.path)  # Считываем книгу эксель в переменную wb_obj
                self.BOOK = self.wb_obj.active
                self.N = self.BOOK.max_row                      # Определяем количество строк таблицы
            except:
                try:
                    self.path = self.showDialog().name  # Если адрес файла получен
                    self.wb_obj = openpyxl.load_workbook(self.path)  # Считываем книгу эксель в переменную wb_obj
                    self.BOOK = self.wb_obj.active
                    self.N = self.BOOK.max_row  # Определяем количество строк таблицы
                except:
                    # Если адрес файла не получен
                    self.BOOK = 'exit'
                    self.N = 'exit'
                    self.wb_obj = 'exit'
 
        return self.BOOK, self.N, self.wb_obj
 
    def showDialog(self):
        self.f = 'error'
        while self.f == 'error':
 
            try:
                fname = QFileDialog.getOpenFileName(self, 'Open file')[0]
                self.f = open(fname)  # Адрес файла получен
 
 
 
            except:
                buttonReply = QMessageBox.question(self, 'Не удалось открыть книгу!!!',
                                                   "Для повторной попытки открыть книгу нажмите 'YES'"
                                                   "\n\nДля выхода нажмите 'CANCEL'",
                                                   QMessageBox.Yes | QMessageBox.Cancel)
 
                if buttonReply == QMessageBox.Yes:
                    self.f = 'error'
 
                if buttonReply == QMessageBox.Cancel:
                    self.f = ''
 
        return self.f
 
app = QApplication(sys.argv)
ex = ExampleA()
ex.show()
sys.exit(app.exec_())
Добавлено через 25 минут
Это основной файл. Когда я его запускаю появляется окно и запускается поток, который должен вызвать открывающую книгу эксель функцию, из другого файла - TP1.py, который я представил в первом сообщении.

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
from PyQt5.QtWidgets import QVBoxLayout
 
import sys
from PyQt5.QtWidgets import (QMainWindow, QTextEdit, QApplication)
from PyQt5.QtCore import QThread, pyqtSignal
 
#from TP1 import ExampleA # Пытаюсь подключить функцию из другого файла
 
class Example(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
        self.statusBar().showMessage('Ready')
        self.setGeometry(600, 600, 250, 150)
        self.setWindowTitle('РАБОТА С EXCEL')
 
        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)
 
        self.show()
 
        self.value = 0
        self.valuetext = 0
 
 
        vbox = QVBoxLayout()
        vbox.addWidget(self.textEdit)
        self.setLayout(vbox)
 
        self.launch_UpdateText() #Запуск отдельного процесса
 
 
    def launch_UpdateText(self):
 
        self.textv = UpdateText(self)
        self.textv.update_text.connect(self.updateTEXT)
        self.textv.start()
 
 
    def updateTEXT(self, valuetext):
        self.textEdit.append(str(valuetext)) #добавляет текст и переносит курсор на строку ниже
 
 
class UpdateText(QThread):  #ОТДЕЛЬНЫЙ ПРОЦЕСС
    update_text = pyqtSignal(str)
    def __init__(self, parent=None):
        super().__init__()
 
    def run(self):
 
        self.update_text.emit("Через 2 секунды откроем книгу эксель")
        QThread.msleep(2000)
        self.update_text.emit("КОЛИЧЕСТВО СТРОК В КНИГЕ:")
        QThread.msleep(2000)
 
        #self.BOOK, self.N, self.wb_obj = ExampleA.OpenBook(self)
        #self.update_text.emit(str(self.N))
 
 
 
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
 
    sys.exit(app.exec_())
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2020, 23:20
Ответы с готовыми решениями:

Вызов функции одного потока в другом
Есть у меня приложение (игра аля GTA SA). И в ее mainloop вклинил свою функцию (то есть получается один поток) Thread1 И есть еще поток...

Вызов функции в другом исполняемом файле
Привет всем. Вопрос такой. Есть исполняемый файл.У которого есть некоторая полезная нагрузка. Тоесть несколько функций. Мне...

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

1
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
17.03.2020, 09:23
В каждом файле создается QApplication и запускается, QApplication должен быть только один, в главном файле должен создаваться второй класс
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2020, 09:23
Помогаю со студенческими работами здесь

Groovy - Вызов в файле метода описанного в другом файле
Вот код загрузки файла в Groovy взятый из книги Башар Абдул-Джавада ... (с небольшой правкой) //chislo.groovy package groovy import...

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

Вызов метода класса, расположенного в другом файле
У нас есть 2 файла ->Sourse.cpp and Sourse.h /*Sourse.cpp*/ #include "C:\Users\USER\Desktop\define.h" int main() { ...

Вызов метода класса в другом файле, не обращаясь к самому классу
Всех приветствую. Есть такой код: class CPlainInsteadView : public CFormView { protected: // создать только из сериализации ...

Можно ли на javascript'e в одном js-файле использовать функции, описанные в другом js-файле?
Подскажите, плз, можно ли на javascript'e в одном js-файле использовать функции, описанные в другом js-файле? (который лежит на другом...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru