先描述一下问题:
在QCombobox 的响应中我链接了函数tab_select(),但是这个函数中的绘图命令并未执行。
然后又尝试了直接调用函数tab_select(),绘图命令成功执行。
请问我应该怎么解决这个问题
#######
class MainApp(QMainWindow, Ui_MainWindow):
def init(self, parent=None):
super().init(parent)
Ui_MainWindow.init(self)
self.setupUi(self)
l = QVBoxLayout(self.widget)
self.fi = TabPlot()
l.addWidget(self.fi)
self.widget.setFocus()
self.setCentralWidget(self.tabWidget)
# self.tab_select()
self.comboBox.activated.connect(self.tab_select)
def tab_select(self):
getdata = mysqldata.Getdata()
time1 = self.spinBox.value()
time2 = self.spinBox_2.value()
name = self.comboBox.currentText()
data_check = getdata.tabData(name, time1, time2)
year = data_check[0]
data = data_check[1]
self.fi.tab_plot(year, data, name)
print(1, name, year, data)
class TabPlot(FigureCanvas):
def init(self):
# 画布上初始化一个图像
self.figure = Figure(figsize=(250, 750), dpi=100)
super().init(self.figure)
def tab_plot(self, year, data, name):
year = year
data = data
name = name
axes = self.figure.add_subplot(111)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
axes.set_xlabel("年份")
axes.set_ylabel(name)
axes.plot(year, data, color='red', marker='*', linestyle='--')
您的问题可能是由于绘图命令执行的上下文问题导致的。当您直接调用 tab_select() 函数时,它是在主线程中执行的,而当您通过 activated 信号链接 tab_select() 函数时,它是在响应事件的线程中执行的。这可能会导致线程问题,例如在响应事件的线程中更新 GUI 控件。
为了解决这个问题,您可以尝试使用 QMetaObject.invokeMethod() 方法来在主线程中执行 tab_select() 函数。您可以将 tab_select() 函数更改为槽,并在 init() 函数中使用 QMetaObject.invokeMethod() 来连接 activated 信号和 tab_select() 槽,
def tab_plot(self, year, data, name): self.figure.clear() year = year data = data name = name ax = self.figure.add_subplot(1, 1, 1) ax.plot(year, data, color='red', marker='*', linestyle='--', labels=name) plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体 ax.set_xlabel('年份') name_check = ["人口", "GDP", "能源", "人均GDP", "人均能源", "能源强度"] units_check = ["万人", "万元", "万吨CE", "万元/万人", "万吨CE/万人", "万吨CE/万元"] for i in range(len(name_check)): if name == name_check[i]: units = units_check[i] ax.set_ylabel(units) # self.ax.xaxis.set_ticks(self.year) self.draw()