从可以在新的班级/窗口中使用的按钮获取价值

时间:2019-05-22 02:13:23

标签: python pyqt5

我希望打开的第一个窗口包含4个按钮以响应数字:2、3、4、5。按下这些按钮之一后,我想关闭窗口,并打开一个带有标签的新窗口(正好我知道它可以工作),并且还希望将该数字用作单独的变量,因为它将选择我要使用的工作表从Excel文件读取。

目前,我可以创建带有框的第一个窗口,当我按下一个框时,会打开新窗口-但我无法获得所做的选择。

就我目前为止...

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QHBoxLayout, QGroupBox, QDialog, QVBoxLayout, QMainWindow

# select floor window
class select_floor_window(QDialog):


    def __init__(self, parent=None):
        super().__init__()
        self.title = 'Select floor'
        self.left = 10
        self.top = 10
        self.width = 320
        self.height = 100

        self.selection_ui()


    def selection_ui(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createHorizontalLayout()

        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

        self.show()

    def createHorizontalLayout(self):

        # box layout
        self.horizontalGroupBox = QGroupBox("Which floor are you on?")
        layout = QHBoxLayout()

        # floor buttons
        floor_2_button = QPushButton("2", self)
        floor_2_button.clicked.connect(self.on_click2)
        layout.addWidget(floor_2_button)

        floor_3_button = QPushButton("3", self)
        floor_3_button.clicked.connect(self.on_click3)
        layout.addWidget(floor_3_button)

        floor_4_button = QPushButton("4", self)
        floor_4_button.clicked.connect(self.on_click4)
        layout.addWidget(floor_4_button)

        floor_5_button = QPushButton("5", self)
        floor_5_button.clicked.connect(self.on_click5)
        layout.addWidget(floor_5_button)

        self.horizontalGroupBox.setLayout(layout)

    # close this window and load main window
    def on_click2(self):
        self.floorchoice = 2
        self.show_main = main_Window()
        self.show_main.show()
        self.hide()
        print("2")
        return floorchoice

    def on_click3(self):
        self.floorchoice = 3
        self.show_main = main_Window()
        self.show_main.show()
        self.hide()
        print("3")
        return floorchoice

    def on_click4(self):
        self.floorchoice = 4
        self.show_main = main_Window()
        self.show_main.show()
        self.hide()
        print("4")
        return floorchoice

    def on_click5(self):
        self.floorchoice = 5
        self.show_main = main_Window()
        self.show_main.show()
        self.hide()
        print("5")
        return floorchoice



# create main window

class main_Window(QMainWindow):


    def __init__(self, parent=None):
        super().__init__(parent)

        self.title = "2ndwindow"
        self.top = 100
        self.left = 100
        self.width = 680
        self.height = 500        

        show_floor_button = QLabel(floorchoice, self)
        show_floor_button.move(100,100)


        # Close app button
        close_app_button = QPushButton("Exit", self)
        close_app_button.move(400,400)
        close_app_button.setToolTip("Close application")
        close_app_button.clicked.connect(self.CloseApp)

        self.InitWindow()


    # showing window
    def InitWindow(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.top, self.left, self.width, self.height)
        self.show()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = select_floor_window()
    sys.exit(app.exec_())

无论如何我尝试设置代码,总是在第二个窗口中说“未定义名称'floorchoice'”,并且无法获取它来显示第一类的结果。

1 个答案:

答案 0 :(得分:0)

被调用的函数不返回任何内容,加上self.floorchoice是不同的floorchoice,第一个是类的属性,另一个是局部变量。

您需要做的是使类通过构造函数或其他方法获取该信息。

在下一个中,我使用functool.partial向调用添加了另一个参数,然后将该参数传递给另一个窗口的构造函数,以便获得该信息。

我认为您的主要错误是由于未考虑到每个变量,实例,对象等在应用程序中具有作用域引起的。

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QHBoxLayout, QGroupBox, QDialog, QVBoxLayout, QMainWindow
from functools import partial

# select floor window
class select_floor_window(QDialog):
    def __init__(self, parent=None):
        super().__init__()
        self.title = "Select floor"
        self.left = 10
        self.top = 10
        self.width = 320
        self.height = 100

        self.selection_ui()

    def selection_ui(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.createHorizontalLayout()
        windowLayout = QVBoxLayout(self)
        windowLayout.addWidget(self.horizontalGroupBox)

    def createHorizontalLayout(self):
        # box layout
        self.horizontalGroupBox = QGroupBox("Which floor are you on?")
        layout = QHBoxLayout()
        self.horizontalGroupBox.setLayout(layout)
        # floor buttons
        for option in (2, 3, 4, 5):
            button = QPushButton(str(option))
            layout.addWidget(button)
            wrapper = partial(self.on_click, option)
            button.clicked.connect(wrapper)

    # close this window and load main window
    def on_click(self, option):
        self.show_main = main_Window(option)
        self.show_main.show()
        self.hide()


# create main window


class main_Window(QMainWindow):
    def __init__(self, option, parent=None):
        super().__init__(parent)

        self.title = "2ndwindow"
        self.top = 100
        self.left = 100
        self.width = 680
        self.height = 500

        show_floor_button = QLabel(str(option), self)
        show_floor_button.move(100, 100)

        # Close app button
        close_app_button = QPushButton("Exit", self)
        close_app_button.move(400, 400)
        close_app_button.setToolTip("Close application")
        close_app_button.clicked.connect(self.close)

        self.InitWindow()

    # showing window
    def InitWindow(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.top, self.left, self.width, self.height)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = select_floor_window()
    ex.show()
    sys.exit(app.exec_())