如何将QComboBox中的文本存储在全局变量中

时间:2019-05-01 11:54:33

标签: python pyqt pyqt5

我有以下代码,在对StackOverflow的答案进行筛选后,我无法设法使它们适应我的代码(非常简单)。 这将创建一个带有两个下拉菜单的窗口(一个下拉菜单选择一个月,另一个下拉菜单选择一年)和一个用于启动脚本其余部分的按钮。

我需要将组合框的“选择”存储在全局变量中,以便在脚本的其余部分中使用。

我不确定这是写得最精美,还是最好的方式。

我不确定是否需要将其封装在某种类中,但是到目前为止我还没有运气。当前,下面的代码仅返回起始文本,而不是下拉菜单中用户选择的文本。

def runapp():
    def on_button_clicked():
        startprocessing()

    app = QApplication([])
    app.setStyle('Fusion')
    window = QWidget()
    layout = QVBoxLayout()
    combobox_month = QComboBox()
    combobox_year = QComboBox()
    progress = QLabel('Test')
    layout.addWidget(progress)
    layout.addWidget(combobox_month)
    layout.addWidget(combobox_year)
    combobox_month.addItems(calendar.month_name)
    combobox_year.addItems(['2017', '2018', '2019'])
    processbutton = QPushButton('Process')
    layout.addWidget(processbutton)
    global month
    month = str(combobox_month.currentText())
    global year
    year = str(combobox_year.currentText())
    processbutton.clicked.connect(on_button_clicked)
    window.setLayout(layout)
    window.show()
    app.exec_()

1 个答案:

答案 0 :(得分:1)

分析您是否需要一门课或分析您提供的内容并不困难,我还建议您阅读Why are global variables evil?,因为您可能正在滥用全局变量。要解决这个问题,您必须通过将插槽连接到currentTextChanged信号来更新变量的值:

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QLabel, QPushButton
from PyQt5.QtCore import pyqtSlot

month = ""
year = ""

def runapp():
    def on_button_clicked():
        # startprocessing()
        print("process")

    app = QApplication([])
    app.setStyle('Fusion')
    window = QWidget()
    layout = QVBoxLayout()
    combobox_month = QComboBox()
    combobox_year = QComboBox()
    progress = QLabel('Test')
    layout.addWidget(progress)
    layout.addWidget(combobox_month)
    layout.addWidget(combobox_year)
    combobox_month.addItems(calendar.month_name)
    combobox_year.addItems(['2017', '2018', '2019'])
    processbutton = QPushButton('Process')
    layout.addWidget(processbutton)
    @pyqtSlot(str)
    def on_combobox_month_changed(text):
        global month
        month = text

    @pyqtSlot(str)
    def on_combobox_year_changed(text):
        global year
        year = text
    combobox_month.currentTextChanged.connect(on_combobox_month_changed)
    combobox_year.currentTextChanged.connect(on_combobox_year_changed)
    processbutton.clicked.connect(on_button_clicked)
    window.setLayout(layout)
    window.show()
    app.exec_()

if __name__ == '__main__':
    runapp()
    print(month, year)