首页 新闻 会员 周边 捐助

pyqt5 QCombobox 事件响应问题

0
悬赏园豆:100 [待解决问题]

先描述一下问题:
在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='--')

流沙角锋的主页 流沙角锋 | 初学一级 | 园豆:102
提问于:2023-03-16 01:26
< >
分享
所有回答(1)
0

您的问题可能是由于绘图命令执行的上下文问题导致的。当您直接调用 tab_select() 函数时,它是在主线程中执行的,而当您通过 activated 信号链接 tab_select() 函数时,它是在响应事件的线程中执行的。这可能会导致线程问题,例如在响应事件的线程中更新 GUI 控件。

为了解决这个问题,您可以尝试使用 QMetaObject.invokeMethod() 方法来在主线程中执行 tab_select() 函数。您可以将 tab_select() 函数更改为槽,并在 init() 函数中使用 QMetaObject.invokeMethod() 来连接 activated 信号和 tab_select() 槽,

Technologyforgood | 园豆:7541 (大侠五级) | 2023-03-28 21:41
你好,谢谢回答。我最终发现是绘图函数出现的错误,这是我现在运行的 tab_select() 函数。区别是添加self.draw()。不过具体原理我也不清楚。
    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()

 

支持(0) 反对(0) 流沙角锋 | 园豆:102 (初学一级) | 2023-03-29 15:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册