pyqt5. Почему в втором окне ничего не выводится?

За pyqt я сел недавно и всех тонкостей не знаю. ниже приведен код моего интерфейса.

# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QWidget, QPushButton
from PyQt5.QtGui import QPixmap, QIcon
import sys

class Window1(QWidget):
    def __init__(self):
        super(Window1, self).__init__()
        self.setWindowTitle('Window1')
        self.setMinimumWidth(200)
        self.setMinimumHeight(50)
        self.button = QPushButton(self)
        self.button.setText('Ok')
        self.button.show()

class Window2(QWidget):
    def __init__(self):
        super(Window2, self).__init__()
        self.setWindowTitle('HI Helper Beta 0.1')
        self.setGeometry(300, 300, 700, 360)
        self.setWindowIcon(QIcon('log.png'))

    def load_image1(self, file_name, z1, z2, z3, z4):
        pixmap = QPixmap(file_name)
        pixmap = pixmap.scaled(250,250)
        self.label = QLabel(self)
        self.label.setPixmap(pixmap)
        self.label.setGeometry(z1, z2, z3, z4)
        self.label.resize(200, 350)
        self.label.setStyleSheet("""
                    QLabel {
                        padding: 4px;
                        border: 4px solid black;
                        background-color: #ffffff;
                    }
                """)


    def load_image(self, file_name, z1, z2, z3, z4):
        pixmap = QPixmap(file_name)
        self.label = QLabel(self)
        self.label.setPixmap(pixmap)
        self.label.setGeometry(z1, z2, z3, z4)

    def set_label(self,text, z1, z2, z3, z4):
        self.label1 = QLabel(self)
        self.label1.setGeometry(z1, z2, z3, z4)
        self.label1.setText(text)
        self.label1.setStyleSheet("""
            QLabel {
                padding: 4px;
                border: 2px solid black;
                background-color: #ffffff;
            }
        """)

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle('MainWindow')

    def show_window_1(self):
        self.w1 = Window1()
        self.w1.button.clicked.connect(self.show_window_2)
        self.w1.button.clicked.connect(self.w1.close)
        self.w1.show()

    def show_window_2(self):
        self.w2 = Window2()
        self.w2.show()

А вот моя основная программа. test1 - интерфейс, код приведен выше

import pandas as pd
from test1 import *

data=pd.read_excel('Valkyries.xlsx')

def  get_data( data, filter_data):
    for i in filter_data:
        data=data[ (data[i[0]]==i[1]) ]
    return data

nameee = 'PSY'
typee = 'Physical'


filt=[['bs type',nameee],['damage type',typee]]

masss = (get_data(data,filt))

print(masss.iloc[:3,:])

name1 = masss['character'].iloc[0]
name2 = masss['character'].iloc[1]
name3 = masss['character'].iloc[2]

BSname1 = masss['battlesuit'].iloc[0]
BSname2 = masss['battlesuit'].iloc[1]
BSname3 = masss['battlesuit'].iloc[2]

char1 = 'D:\expsys\images\%s\%s' % (name1, BSname1)
char2 = 'D:\expsys\images\%s\%s' % (name2, BSname2)
char3 = 'D:\expsys\images\%s\%s' % (name3, BSname3)

type1 = 'D:\expsys\%s' % masss['bs type'].iloc[0]
type2 = 'D:\expsys\%s' % masss['bs type'].iloc[1]
type3 = 'D:\expsys\%s' % masss['bs type'].iloc[2]


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    ex = Window2()

    w = MainWindow()

    ex.load_image1(char1, 0, 0, 0, 0)
    ex.load_image1(char2, 250, 0, 0, 0)
    ex.load_image1(char3, 500, 0, 0, 0)

    ex.set_label(name1, 50, 300, 150, 30)
    ex.set_label(name2, 300, 300, 150, 30)
    ex.set_label(name3, 550, 300, 150, 30)

    ex.set_label(BSname1, 50, 328, 150, 30)
    ex.set_label(BSname2, 300, 328, 150, 30)
    ex.set_label(BSname3, 550, 328, 150, 30)

    ex.load_image(type1, 10, 310, 150, 30)
    ex.load_image(type2, 260, 310, 150, 30)
    ex.load_image(type3, 510, 310, 150, 30)

    ex.show()
    w.show_window_1()
    sys.exit(app.exec_())

моя проблема заключается в том, что когда я открываю окно2 через окно1 оно пустое, а если я напрямую открываю окон2 оно заполнено.

Моя программа должна будет получать параметры через окно1 и по нажатию кнопки выдавать результат в окне2. Параметры в самой проге заданы, но результата нет.


Ответы (1 шт):

Автор решения: S. Nick

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

main.py

import sys
import pandas as pd
from PyQt5.Qt import *
from test1 import Window1, Window2                              # !!!


data = pd.read_excel('Valkyries.xlsx')

def  get_data( data, filter_data):
    for i in filter_data:
        data = data[ (data[i[0]]==i[1]) ]
    return data

nameee = 'PSY'
typee = 'Physical'


filt = [['bs type',nameee],['damage type',typee]]

masss = (get_data(data, filt))
print(masss.iloc[:3,:])


class MainWindow(QMainWindow):
    def __init__(self, masss):
        super(MainWindow, self).__init__()
        self.setWindowTitle('MainWindow')
        self.masss = masss
        
        name1 = masss['character'].iloc[0]
        name2 = masss['character'].iloc[1]
        name3 = masss['character'].iloc[2]

        BSname1 = masss['battlesuit'].iloc[0]
        BSname2 = masss['battlesuit'].iloc[1]
        BSname3 = masss['battlesuit'].iloc[2]

        char1 = 'D:\expsys\images\%s\%s' % (name1, BSname1)
        char2 = 'D:\expsys\images\%s\%s' % (name2, BSname2)
        char3 = 'D:\expsys\images\%s\%s' % (name3, BSname3)

        type1 = 'D:\expsys\%s' % masss['bs type'].iloc[0]
        type2 = 'D:\expsys\%s' % masss['bs type'].iloc[1]
        type3 = 'D:\expsys\%s' % masss['bs type'].iloc[2]
        
        self.ex = Window2(self)                                     # !!!
        
        self.ex.load_image1(char1, 0, 0, 0, 0) 
        self.ex.load_image1(char2, 250, 0, 0, 0)
        self.ex.load_image1(char3, 500, 0, 0, 0)
        self.ex.set_label(name1, 50, 300, 150, 30)
        self.ex.set_label(name2, 300, 300, 150, 30)
        self.ex.set_label(name3, 550, 300, 150, 30)
        self.ex.set_label(BSname1, 50, 328, 150, 30)
        self.ex.set_label(BSname2, 300, 328, 150, 30)
        self.ex.set_label(BSname3, 550, 328, 150, 30)
        self.ex.load_image(type1, 10, 310, 150, 30)
        self.ex.load_image(type2, 260, 310, 150, 30)
        self.ex.load_image(type3, 510, 310, 150, 30)
        
        self.w1 = Window1()                                         # !!!
        
        self.show_window_1()                                        # !!!
    
    def show_window_1(self):
        self.w1.button.clicked.connect(self.show_window_2)
        self.w1.show()

    def show_window_2(self):
        self.ex.show()
        self.w1.hide()
        
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    w = MainWindow(masss)                                            # ! masss
    
    sys.exit(app.exec_())

test1.py

from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QWidget, QPushButton
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtCore import Qt


class Window1(QWidget):
    def __init__(self):
        super(Window1, self).__init__()
        self.setWindowTitle('Window1')
        self.setMinimumWidth(200)
        self.setMinimumHeight(50)
        self.button = QPushButton(self)
        self.button.setText('Ok')
        self.button.show()

class Window2(QWidget):
#    def __init__(self):
#        super(Window2, self).__init__()
    def __init__(self, parent=None):                           # +
        super(Window2, self).__init__(parent, Qt.Window)       # +
        
        self.parent = parent                                   # +
        
        self.setWindowTitle('HI Helper Beta 0.1')
        self.setGeometry(300, 300, 700, 360)
        self.setWindowIcon(QIcon('log.png'))

    def load_image1(self, file_name, z1, z2, z3, z4):
        pixmap = QPixmap(file_name)
        pixmap = pixmap.scaled(250,250)
        self.label = QLabel(self)
        self.label.setPixmap(pixmap)
        self.label.setGeometry(z1, z2, z3, z4)
        self.label.resize(200, 350)
        self.label.setStyleSheet("""
                    QLabel {
                        padding: 4px;
                        border: 4px solid black;
                        background-color: #ffffff;
                    }
                """)

    def load_image(self, file_name, z1, z2, z3, z4):
        pixmap = QPixmap(file_name)
        self.label = QLabel(self)
        self.label.setPixmap(pixmap)
        self.label.setGeometry(z1, z2, z3, z4)

    def set_label(self,text, z1, z2, z3, z4):
        self.label1 = QLabel(self)
        self.label1.setGeometry(z1, z2, z3, z4)
        self.label1.setText(text)
        self.label1.setStyleSheet("""
            QLabel {
                padding: 4px;
                border: 2px solid black;
                background-color: #ffffff;
            }
        """)
# +++
    def closeEvent(self, event):                                 # +++
        self.parent.show()                                       # +++
→ Ссылка