从不同选项卡 FLTK 开始的线程中隐藏小部件

Posted

技术标签:

【中文标题】从不同选项卡 FLTK 开始的线程中隐藏小部件【英文标题】:hiding a widget from a thread starting in a different tab FLTK 【发布时间】:2014-03-28 17:13:02 【问题描述】:

我在 FLTK 中遇到了一些奇怪的行为,我正在尝试解决它。基本上我在 main 中有这种格式:

int main()

    Fl::lock(); //will be doing multithreading
    win= new Fl_Double_Window(0.5*(Fl::w()-w),0.5*(Fl::h()-h),w,h, "Program");
    win->begin();

    Fl_Tabs* oo = new Fl_Tabs(10,20,win->w()-20,win->h()-140);

        Fl_Group* a = new Fl_Group(20, 40, oo->w(),oo->h(), "Send to ");
            Fl_Box* control_box= Fl_Box(x,y,w,h,"Comparison Test");
            Fl_Button* button = Fl_Button(x,y,w,h,"run");
            button->callback((Fl_Callback*) run_cb);
        a->end();
        
        Fl_Group* b = new Fl_Group(20, 40, oo->w(),oo->h(), "");
            Fl_Box* box= Fl_Box(x,y,w,h,"Warning");
            box->hide();
            //user does something here which causes box to box->show(); displaying warning
        b->end();
        

    oo->end();

    win->end();
    return Fl::run();



//functions

void run_cb(Fl_Widget* widget,void* data)

    fl_create_thread(thread1,calculate,NULL);



void* calculate(void* data)
    //do some calculations
    Fl::lock();
    //update some data structures
    Fl::unlock();
    //PROBLEM IS HERE<--------------------

现在,我的问题是,在这个“

一切我尝试是否是 Fl::awake()Fl::awake(&amp;check_from_thread) 其中 check_fom_thread 是适当的函数(包含 box-&gt;hide() Fl::check()Fl::flush() 等的每个排列)要运行在父 (GUI) 线程或线程中的 box->hide() 中,在锁定解锁对内部或外部,在 Fl::awake() 调用之前和之后(再次在锁定解锁对内部或外部)失败获得正确的功能:

显示警告框,我切换到第一个选项卡,按下运行回调的按钮然后线程,但在完成之前我切换回第二个选项卡,我希望警告框在完成后消失线程函数调用。但它不会被隐藏。但是,如果在线程完成后,我切换到选项卡 a 然后返回到选项卡 b,那么它就会被隐藏。

另一方面,如果我不是在选项卡 b 中隐藏“box”,而是在选项卡 a 中隐藏“control_box”,那么我上面描述的几乎所有排列都可以正常工作。

我不知道为什么会这样。

有人有什么想法吗?

我认为这可能是因为 Fl_Tabs 在后台使用 ->hide() 和 ->show() 意味着可能会覆盖小部件属性,但这没有意义,因为如果我切换到选项卡 b在隐藏“盒子”的线程结束之前,在更新选项卡时 b 显示为小部件“盒子”,但盒子无法隐藏。但是,当从 a 运行的线程在更新时最终隐藏“control_box”时,同样的情况也适用:选项卡 a 显示为“control_box”,但这种情况有效。扯掉我的头发!...

【问题讨论】:

【参考方案1】:

我不知道为什么会发生上述情况,但是一种应该起作用的方法(调用与我想隐藏的框的父小部件相关联的 redraw() 方法)没有,但最终调用的是redraw() 在整个父窗口上。不是特别优雅,但确实可以。

【讨论】:

以上是关于从不同选项卡 FLTK 开始的线程中隐藏小部件的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将小部件显示为两个不同的选项卡?

如何访问 QTabWidget 不同选项卡中的小部件?

将自定义小部件添加到 Flutter TabBar 的活动选项卡

每个选项卡小部件的 PyQt 选项

PyQT - 在特定选项卡中引用小部件

使用 ttk.Notebook 小部件从右到左对齐选项卡