Ipywidget在“ while为True”循环中不交互

问题描述 投票:0回答:1

1)这是我尝试运行的代码段。主要思想是,我希望ipywidgets是交互式的,同时不断从数据源中获取数据。目标是使用@interact函数通过更改要考虑的主分量(PC)的数量以交互方式绘制主分量,从而绘制数据。它也可以在没有while循环的情况下运行得非常好,也就是说,当我们不考虑使用while循环进行数据集的自动更新时。但是,当我包含while循环时,它不处理小部件的交互性(即PC数量的交互)。我的感觉是,由于某些执行问题,“ while True”循环不允许ipywidget进行交互。

2)我也研究了线程,但是我不确定如何使用functools(select_data)中的函数,可以使用threading.Thread进行调用。

任何帮助将不胜感激。谢谢

def data_import_date(start_date,end_date):
    end_date1=end_date.strftime('%Y-%m-%dT%H:%M:%S')
    start_date=pd.Timestamp(start_date)
    end_date=pd.Timestamp(end_date1)

    button=widgets.Button(description='Pull Data')
    button.on_click(functools.partial(select_data,rs_=[start_date,end_date]))

    vbox=widgets.VBox([button])
    display(vbox,out)


def select_data(b,rs_):
#     clear_output()
    start_date=rs_[0]
    end_date1=rs_[1]
    print("Data pulling started")

    with out:
        clear_output()
        seeq_login() 
        [item1,item2]=query_seeq_for_data()
        i=0
        while True:
            end_date=end_date1.strftime('%Y-%m-%dT%H:%M:%S')
            print("Start & End date: ",start_date,end_date)
            if i==0:
                [X_data,Y_data]=pull_data(item1,item2,start_date,end_date)
            else:
                [X_data_live,Y_data_live]=pull_data(item1,item2,start_date,end_date)
                X_data=X_data.append(X_data_live)
                Y_data=Y_data.append(Y_data_live)
            print("Data pulling completed.\nNow you're ready for your analysis")

            clear_output()
            [X_train,X_test,Y_train,Y_test]=train_test(X_data,Y_data)

            [Xp_train,components,explained_variance_ratio,_,_]=apply_PCA(X_train,X_test)
            plot_PC_variance(X_data,explained_variance_ratio)
            plot_PC(X_data,components)

            time.sleep(20)
            start_date=end_date
            end_date1=end_date1+datetime.timedelta(days=1)
            i+=1



  a=interact(data_import_date,
           start_date=widgets.DatePicker(value=pd.to_datetime(start_date)),
           end_date=widgets.DatePicker(value=pd.to_datetime(end_date)))


def plot_PC(X_data,components):
    Np_comp=(1,len(X_data.columns),1)
    @interact
    def principal_components(PC1=Np_comp,PC2=Np_comp):
        fig,ax=plt.subplots(1,1,figsize=(10,10))
        plt.figure(5)
        print(PC1, PC2)

        ax.set_xlabel("Principal Component {}".format(PC1), fontsize=14)
        ax.set_ylabel("Principal Component {}".format(PC2), fontsize=14)
        ax.set_title("Principal components {0} & {1}".format(PC1,PC2), fontsize=(20))
        ax.scatter(components[:,PC1],components[:,PC2])
while-loop jupyter-notebook python-3.5 ipywidgets voila
1个回答
0
投票

一个相当基本的示例,它显示了如何在轮询小部件更改的同时运行循环,但这并不是我真正的专业领域。

在打印值时拖动滑块,您应该看到打印的值发生变化以反映当前滑块的位置。


import threading
from IPython.display import display
import ipywidgets as widgets
import time
float_val = widgets.FloatSlider()
display(float_val)

def work(progress):
    total = 10
    for i in range(total):
        time.sleep(1)
        print(float_val.value)

thread = threading.Thread(target=work, args=(progress,))

thread.start()
© www.soinside.com 2019 - 2024. All rights reserved.