@WIIC

Как передать информацию в дочернее окно в PyQt?

Разбираюсь в основах создания форм на питон. Решил сделать программу по вырезке выделенной фотографии(все файлы пронумерованы от 0 до N).
Всего два окна, в одном показывается список фотографий и сами фотографии. А во втором только фотография и отслеживается нажатие/отжатие мыши( в дочернем окне), записываются их координаты соответственно и должно получаться имя файла в списке для дочернего окна, для последующей обрезки.
Но при попытке получить имя файла из списка выдаётся ошибка 'Cutt' object has no attribute 'spisok' .
Основное окно:
class Cutt(QMainWindow):

    def __init__(self):
        super(Cutt, self).__init__()
        self.ui = Ui_Cutt()
        self.ui.setupUi(self)
        self.ui.btnstart.clicked.connect(lambda: self.createwindow())
        self.ui.btnstart.clicked.connect(lambda: self.showpic1())

    def folderto(self) -> None:
        self.ui.spisok.clear()
        global pathto
        pathto = PySide6.QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите папку")
        if pathto:
            for file_name in os.listdir(pathto):
                self.ui.spisok.addItem(file_name)

    def showpic1(self) -> None:
        global image
        if self.ui.spisok.currentItem() is None:
            image = QImage(f"{pathto}\\0.jpg")
            self.okno2.picture.setPixmap(QPixmap.fromImage(image))
        else:
            image = QImage(f"{pathto}\\{self.ui.spisok.currentItem().text()}")
            self.okno2.picture.setPixmap(QPixmap.fromImage(image))

    def createwindow(self) -> None:
        self.okno2 = TwoWindow()
        self.okno2.show()

Дочернее окно
class TwoWindow(PySide6.QtWidgets.QMainWindow, design2.Ui_MainWindow):

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.ui = Cutt()

    def mousePressEvent(self, event):
        global y1
        global x1
        x1 = event.x()
        y1 = event.y()
        print(x1, y1)

    def mouseReleaseEvent(self, event):
        global y2
        global x2
        x2 = event.x()
        y2 = event.y()
        print(x2, y2)
        self.cuttimage()

    def cuttimage(self) -> None:
        global m
        m += 1
        if self.ui.spisok.currentItem() is None:
            im = Image.open(f"{pathto}\\0.jpg")
        else:
            im = Image.open(f"{pathto}\\{self.ui.spisok.currentItem().text()}")
        xn = (x1 - 20)/kx
        xk = (x2 - 20)/kx
        yn = (y1 - 20)/ky
        yk = (y2 - 20)/ky
        im_crop = im.crop((xn, xk, yn, yk))
        im_crop.save(f'{m}.jpg', quality=95)
  • Вопрос задан
  • 224 просмотра
Решения вопроса 2
HemulGM
@HemulGM
Delphi Developer, сис. админ
Потому что Cutt - это класс окна, а не окно. Обращаться нужно к объекту окна
Ответ написан
@WIIC Автор вопроса
Так-с, спасибо комментатору сверху. В общем, да, надо обращаться к окну. Чтобы передать из Основного окна в дочернее информацию, надо обратиться к Основному окну, которое имеет своё название, к примеру, у меня
window = Cutt()
    window.show()

И чтобы взять информацию об текущем элементе списка Основного окна, нужно в дочернем окне обращаться к Основному окну, например, у меня
if window.ui.spisok.currentItem() is None:
            im = Image.open(f"{pathto}\\0.jpg")
        else:
            im = Image.open(f"{pathto}\\{window.ui.spisok.currentItem().text()}")
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы