python: использование вывода класса метода внутри другого класса

Я пытаюсь разработать свое первое приложение с PyQt5 (игра с памятью).

Я создал два класса: MainApplication , который наследует от QMainWindow и GridWidget , который наследуется от QWidget. Моя цель – дать пользователю указать папку с некоторыми изображениями (jpg) с помощью fileMenu в menuBar.

Итак, в MainApplication я создал метод showDialog, который подключается к файлуMenu и выводит список имен файлов (имена изображений в выбранной папке), хранящихся в переменной списка. Я хотел бы передать это в GridWidget , чтобы он мог создавать и заполнять сетку.

Я отчасти новичок в программировании ООП, поэтому, возможно, организация моего сценария не самая лучшая, и я открыт для предложений по ее улучшению. Моя идея заключалась в том, чтобы добавить GridWidget в MainApplication , но я не знаю, как передать результат showDialog . Любое предложение будет оценено по достоинству.

Вот мой код:

#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Memory game My first memory game in PyQt5. author: Umberto Minora last edited: September 2016 """ import os, sys, glob from PyQt5.QtWidgets import (QMainWindow, QWidget, QGridLayout, QPushButton, QApplication, QAction, QFileDialog) from PyQt5.QtGui import QPixmap class MainApplication(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.statusBar() openFile = QAction('Open', self) openFile.setStatusTip('Search image folder') openFile.triggered.connect(self.showDialog) menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(openFile) self.form_widget = GridWidget(self) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('Memory Game!') self.show() def showDialog(self): folder = str(QFileDialog.getExistingDirectory(self, "Select Directory", '/home', QFileDialog.ShowDirsOnly)) images = glob.glob(os.path.join(folder, '*.jpg')) if images: return images * 2 class GridWidget(QWidget): def __init__(self): super().__init__() grid = QGridLayout() self.setLayout(grid) names = self.showDialog() # DA SISTEMARE!!!!!! positions = [(i,j) for i in range(int(len(names)/2)) for j in range(int(len(names)/2))] for position, name in zip(positions, names): if name == '': continue button = QPushButton(name) grid.addWidget(button, *position) if __name__ == '__main__': app = QApplication(sys.argv) ex = MainApplication() sys.exit(app.exec_()) 

РЕДАКТИРОВАТЬ

Благодаря ответу @ekhumoro , теперь код работает. Вот код, который я на самом деле выполняю (это не полная игра, просто начальный импорт изображений из папки).

 #!/usr/bin/python3 # -*- coding: utf-8 -*- """ Memory game 2 My first memory game in PyQt5. author: Umberto Minora last edited: September 2016 """ import os, sys, glob, math from PyQt5.QtWidgets import (QMainWindow, QWidget, QGridLayout, QPushButton, QApplication, QAction, QFileDialog, QLabel) from PyQt5.QtGui import QPixmap class MainApplication(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.statusBar() openFile = QAction('Open', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Search image folder') openFile.triggered.connect(self.showDialog) menubar = self.menuBar() self.fileMenu = menubar.addMenu('&File') self.fileMenu.addAction(openFile) self.gridWidget = QWidget(self) self.gridLayout = QGridLayout(self.gridWidget) self.setCentralWidget(self.gridWidget) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('Memory Game!') self.show() def populateGrid(self, images): names = images * 2 n_cols = math.ceil(math.sqrt(len(names))) n_rows = math.ceil(math.sqrt(len(names))) positions = [(i,j) for i in range(n_cols) for j in range(n_rows)] for position, name in zip(positions, names): if name == '': continue pixmap = QPixmap(name) scaled = pixmap.scaled(pixmap.width()/3, pixmap.height()/3) del(pixmap) lbl = QLabel(self) lbl.setPixmap(scaled) self.gridLayout.addWidget(lbl, *position) def showDialog(self): folder = str(QFileDialog.getExistingDirectory(self, "Select Directory", '.', QFileDialog.ShowDirsOnly)) images = glob.glob(os.path.join(folder, '*.jpg')) if images: self.populateGrid(images) if __name__ == '__main__': app = QApplication(sys.argv) ex = MainApplication() sys.exit(app.exec_()) 

One Solution collect form web for “python: использование вывода класса метода внутри другого класса”

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

Вот как должен выглядеть класс:

 class MainApplication(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.statusBar() openFile = QAction('Open', self) openFile.setStatusTip('Search image folder') openFile.triggered.connect(self.showDialog) menubar = self.menuBar() self.fileMenu = menubar.addMenu('&File') self.fileMenu.addAction(openFile) self.gridWidget = QWidget(self) self.gridLayout = QGridLayout(self.gridWidget) self.setCentralWidget(self.gridWidget) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('Memory Game!') self.show() def populateGrid(self, images): names = images * 2 positions = [(i,j) for i in range(int(len(names)/2)) for j in range(int(len(names)/2))] for position, name in zip(positions, names): if name == '': continue button = QPushButton(name) self.gridLayout.addWidget(button, *position) def showDialog(self): folder = str(QFileDialog.getExistingDirectory(self, "Select Directory", '/home', QFileDialog.ShowDirsOnly)) images = glob.glob(os.path.join(folder, '*.jpg')) if images: self.populateGrid(images) 
  • Обработка одноразовых исключений
  • Python 3.2: невозможно импортировать модуль sqlite3
  • Ошибка при использовании importlib.util для проверки библиотеки
  • В чем разница между concurrent.futures и asyncio.futures?
  • ValueError: неверный литерал для int () с базой 10
  • Версия Python для новичков
  • Файл поиска can not Python
  • Сортировка списка по атрибуту, который может быть None
  • Python 3 встроенных типов __init__ не вызывает super () .__ init__?
  • Ошибка Python 3.5 OpenSSL
  • читать исходный ввод с клавиатуры в python
  • Python - лучший язык программирования в мире.