Python 如何向下传递滑块';不同选项卡之间的值是多少?

Python 如何向下传递滑块';不同选项卡之间的值是多少?,python,python-3.x,pyqt,pyqt4,qslider,Python,Python 3.x,Pyqt,Pyqt4,Qslider,我目前正在使用PyQt4制作GUI。我的问题如下:如何在不同的QtGui.QTabWidget之间传递QtGui.QSlider的值?下面是一个包含3个选项卡的最小工作示例: import numpy as np from PyQt4 import QtCore, QtGui import matplotlib.pyplot as plt # from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCan

我目前正在使用PyQt4制作GUI。我的问题如下:如何在不同的
QtGui.QTabWidget
之间传递
QtGui.QSlider
的值?下面是一个包含3个选项卡的最小工作示例:

import numpy as np
from PyQt4 import QtCore, QtGui
import matplotlib.pyplot as plt
#
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
#%%
# some Arbitrary data
nbr_points = 500
my_X_data = np.linspace(-10,10,nbr_points)
#
my_Y_data_tab1 = my_X_data**3 + 100*np.cos(my_X_data*5)
my_Y_data_tab2 = np.tan(my_X_data)
my_Y_data_tab3 = -10*my_X_data *np.sin(my_X_data)

class MyWidget(QtGui.QMainWindow):
    def __init__(self):
        super(MyWidget, self).__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(600,300,1000,600) 
        tabs = QtGui.QTabWidget() 
        # creation of 3 tabs
        self.tab_plot1 = QtGui.QWidget()
        self.tab_plot2 = QtGui.QWidget()
        self.tab_plot3 = QtGui.QWidget()
        # 
        self.setCentralWidget(tabs) 
        #
        self.tab_plot_1()
        self.tab_plot_2()
        self.tab_plot_3()
        tabs.addTab(self.tab_plot1, 'tab1')
        tabs.addTab(self.tab_plot2, 'tab2')
        tabs.addTab(self.tab_plot3, 'tab3')
        self.show()

    def tab_plot_1(self):
        self.figure_1 = plt.figure(figsize=(15,5))
        self.canvas_1 = FigureCanvas(self.figure_1)
        # Slider
        self.slider_1 = QtGui.QSlider(minimum=0, 
            maximum= nbr_points-1, 
            orientation=QtCore.Qt.Horizontal,
            tickInterval=1)
        self.slider_1.valueChanged.connect(self.on_valueChanged_1)
        ax = self.figure_1.add_subplot(111)
        ax.clear()
        ax.plot(my_X_data,my_Y_data_tab1,'b-')        
        ax.set_xlim([-10,10])  
        ax.set_ylim([-1000,1000])  
        X_point, Y_point = [],[]
        self.scat_1 = ax.scatter(X_point, Y_point, s=100,c='k')
        layout = QtGui.QFormLayout()
        layout.addRow(self.canvas_1)
        layout.addRow(self.slider_1)
        self.tab_plot1.setLayout(layout)       

    def tab_plot_2(self):
        self.figure_2 = plt.figure(figsize=(15,5))
        self.canvas_2 = FigureCanvas(self.figure_2)
        # Slider
        self.slider_2 = QtGui.QSlider(minimum=0, 
            maximum= nbr_points-1, 
            orientation=QtCore.Qt.Horizontal,
            tickInterval=1)
        self.slider_2.valueChanged.connect(self.on_valueChanged_2)
        ax = self.figure_2.add_subplot(111)
        ax.clear()
        ax.plot(my_X_data,my_Y_data_tab2,'r-')        
        ax.set_xlim([-10,10])  
        ax.set_ylim([-1000,1000])  
        X_point, Y_point = [],[]
        self.scat_2 = ax.scatter(X_point, Y_point, s=100,c='k')
        layout = QtGui.QFormLayout()
        layout.addRow(self.canvas_2)
        layout.addRow(self.slider_2)
        self.tab_plot2.setLayout(layout)

    def tab_plot_3(self):
        self.figure_3 = plt.figure(figsize=(15,5))
        self.canvas_3 = FigureCanvas(self.figure_3)
        # Slider
        self.slider_3 = QtGui.QSlider(minimum=0, 
            maximum= nbr_points-1, 
            orientation=QtCore.Qt.Horizontal,
            tickInterval=1)
        self.slider_3.valueChanged.connect(self.on_valueChanged_3)
        ax = self.figure_3.add_subplot(111)
        ax.clear()
        ax.plot(my_X_data,my_Y_data_tab3,'g-')        
        ax.set_xlim([-10,10])  
        ax.set_ylim([-1000,1000])  
        X_point, Y_point = [],[]
        self.scat_3 = ax.scatter(X_point, Y_point, s=100,c='k')
        layout = QtGui.QFormLayout()
        layout.addRow(self.canvas_3)
        layout.addRow(self.slider_3)
        self.tab_plot3.setLayout(layout)      

    @QtCore.pyqtSlot(int)
    def on_valueChanged_1(self, value):
        X_point = my_X_data[value,]
        Y_point = my_Y_data_tab1[value,]
        self.scat_1.set_offsets(np.c_[X_point,Y_point])   
        self.canvas_1.draw()

    @QtCore.pyqtSlot(int)
    def on_valueChanged_2(self, value):
        X_point = my_X_data[value,]
        Y_point = my_Y_data_tab2[value,]
        self.scat_2.set_offsets(np.c_[X_point,Y_point])   
        self.canvas_2.draw()

    @QtCore.pyqtSlot(int)
    def on_valueChanged_3(self, value):
        X_point = my_X_data[value,]
        Y_point = my_Y_data_tab3[value,]
        self.scat_3.set_offsets(np.c_[X_point,Y_point])   
        self.canvas_3.draw()

def main():
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
在这种情况下,当存在本地修改时,滑块的值应向下传递到不同的选项卡,以便在跨选项卡浏览时将相同的本地值强制传递给其他选项卡

最后的审判没有成功。。。任何帮助都将不胜感激。

如果我理解清楚, 如果滑块上的值已更改(例如滑块_1),请将该值设置为其他两个滑块(滑块_2和滑块_3)

e、 g

滑块\u 1
上的值更改时,您正在调用
self。在\u valueChanged\u 1
上,您可以在该函数中执行以下操作:

def on_valueChanged_1(self, value):
    X_point = my_X_data[value,]
    Y_point = my_Y_data_tab1[value,]
    self.scat_1.set_offsets(np.c_[X_point,Y_point])   
    self.canvas_1.draw()

    # Get current value 
    curr_value = self.slider_1.value()
    # Set the value of the slider on which the value has been changed to the other two sliders
    self.slider_2.setValue(curr_value)
    self.slider_3.setValue(curr_value)

对函数中的其他两个滑块重复此操作,分别是\u valueChanged\u 2上的
和\u valueChanged\u 3上的

谢谢您的回答@ncica,现在可以了,我不知道为什么我之前没有想到这个简单的解决方案!如果这三个滑块必须具有相同的值,在
QTabWidget
外部有一个滑块不是更简单吗?是的,这三个滑块必须具有相同的值,但实际上有更多的选项卡不需要在其上/下滑动。@Yacola我不明白你的意思,这是你自己的问题,所以你有权编辑它question@eyllanesc没关系,我刚刚发现我是唯一一个可以看到该帖子被删除的重复答案的人,很抱歉占用您的时间:)
def on_valueChanged_1(self, value):
    X_point = my_X_data[value,]
    Y_point = my_Y_data_tab1[value,]
    self.scat_1.set_offsets(np.c_[X_point,Y_point])   
    self.canvas_1.draw()

    # Get current value 
    curr_value = self.slider_1.value()
    # Set the value of the slider on which the value has been changed to the other two sliders
    self.slider_2.setValue(curr_value)
    self.slider_3.setValue(curr_value)