我有以下代码,在对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_()
答案 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)