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) 
  • Невозможно интерпретировать MATLAB interp2d в Python scipy.interp
  • Как загрузить файл с помощью urllib.request в Python 3?
  • Почему пакет компилятора прекращен в Python 3?
  • Получить определяющий класс объекта несвязанного метода в Python 3
  • Как использовать переменную внутри регулярного выражения?
  • Преобразовать встроенный тип функции в тип метода (в Python 3)
  • Python: путаницы с urljoin
  • Округление поплавков с ошибкой представления до ближайшего и правильного результата
  •  
    Interesting Posts for Van-Lav

    Python: функция диапазона для десятичных чисел

    Неожиданный вывод из списка (генератор)

    Использование PunktSentenceTokenizer в NLTK

    NSUserNotificationCenter.defaultUserNotificationCenter () возвращает None в python

    Python: создание нескольких списков

    Как обрабатывать asyncore внутри класса в python, не блокируя ничего?

    Связь между двумя сеансами гном-терминала

    Применить границы ко всем ячейкам в диапазоне с помощью openpyxl

    Значение параметра тензорного потока Tensorflow variable_scope означает значение параметра

    Существует ли эквивалент Python для модификатора Perl «/ x» для регулярных выражений?

    Пилоны Загрузка искаженных изображений в Windows

    Никакое соединение не может быть сделано, потому что целевая машина активно отказалась от него (Django)

    Python – печатать элементы кортежа без скобок

    Что произойдет, если вы пишете имя переменной только в python?

    используя pip для локального размещения пакетов, несмотря на удовлетворенные глобальные требования

    Python - лучший язык программирования в мире.