Найти - Пользователи
Полная версия: Вопрос по QThread
Начало » Python для новичков » Вопрос по QThread
1
scarfaceDeb
Пытаюсь освоить QThread. Синтаксис в целом понял, но возник вопрос в том, как применить это в своем коде.

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

и с целью добавления прогресс бара понадобилось использование QThread.

а проблема вот в чем:
есть сейчас в коде 2 класса - один с GUI, другой с рабочим кодом *Renamer(), где и происходит переименование.
И застрял, во многом из-за отсутствия опыта планирования структуры серьезных прог, в том - как организовать взаимодействие QProgressBar с рабочим классом Renamer().

т.е. я создал новый класс Worker(Qthread), в нём в функции run() собственно и будет создаваться по плану объект класса Renamer().
но каким образом реализовать посыл сигналов из класса Renamer() в класс GUI не могу придумать.
вернее, единственное, что пока пришло в голову - это перенести весь код из Renamer() в класс Worker, и тогда в процессе выполнения этого кода и будут посылаться сигналы в класс GUI.*например, после каждой пройденной папки при переименовании*
но такой подход кажется мне неудобным в плане последующей читабельности и удобства кода.
pasaranax
qt-шные сигналы и шли
scarfaceDeb
но как сделать, чтобы они были “от одного объекта”.
сейчас объясню о чем я:

что-то типа такого:

class GUI(QMainWindow):

#создается сперва объект класса Worker здесь
self.thread = Worker()

#здесь ясно дело будет connect
self.connect(self.thread, SIGNAL('custom(step(int))'), self.incrementBar)


def incrementBar(self):
#собственно, заполнение бара на шаг step


class Worker(QThread):

#здесь, метод run, в котором и создается объект класса Renamer()
def run():
test = Renamer()


#это сам рабочий код
class Renamer():


#и допустим, есть что-то типа простого цикла
for i in xrange(10):
#вот здесь начинаю не понимать.
#не могу же я просто написать
emit(SIGNAL('custom(int max)'))

#по логике, emit() это функция объекта класса Worker()
#но если я создам новую переменную
self.thread2 = Worker()
#и затем произведу сигнал
self.thread2.emit(SIGNAL('custom(int max)'))
#то ведь это будет уже другая instance класса Worker
#и поэтому self.connect(self.thread, SIGNAL('custom(step(int))'), self.incrementBar) не сработает.
вот в этом у меня загвоздка.
единственно, сейчас мысль возникла в классе Worker() добавить в отдельной функции в виде аргумента объект класса Worker.
т.е.
def test(self, thread):
self.thread = thread

а после инициализации в классе GUI: self.thread = Worker()
добавить что-то типа self.thread.test(self.thread)
ну и потом, передать self.thread уже в классе Worker() классу Renamer() в кач-ве аргумента.
т.е. test = Renamer(self.thread)


вижу, что просто чего-то недопонимаю..
и код, если что, написан скорее для наглядности. чем ради корректности.
ZZZ
Давно это было, но посмотри сюда
Вполне вероятно, что у тебя тут вообще можно обойтись генератором без нитей, так как операция переименования одного файла очень быстрая.
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