c++ - C++ 中的 GTK : Changing a Label based on console input

标签 c++ io gtk

为了证明我的意思,我写了这段代码,没有大部分 gtk 困惑:

//more gtk declaration stuff above
int access;
access = 0;

int tries;
tries = 0;

string input;
input = "";

string code;
code = "";

while(access != 1 && tries < 4){
    directions((gpointer)lbl); //change label to "type 'finger'"
    cin >> input;

    if(input.compare("finger") = 0){
        while(code.compare("1") != 0 && tries < 4){
            fpcheck((gpointer)lbl); //change label "Enter the secret code ('1')"
            cin >> code;
            if(code.compare("1") != 0){
                retry((gpointer) lbl);//change label "Try again!"
                tries ++;       
            }
            else{
                fprecog((gpointer) lbl); //change label "Recognized!"
                access = 1;
            }
        }
    }
}
if(access = 1)
    //change label "Access Granted!"
else
    //change label "No access."

gtk_main();
return 0;

显然这不会完全起作用,因为 gtk_main() 没有被调用到最后。控制台的东西会运行良好,但窗口直到最后才会弹出,所以用户不知道该怎么做,如果我把 gtk_main() 放在早期,程序就会卡在 gtk_main() 循环中所以什么都不会发生。

这种流程在 GTK 中通常是如何完成的?我已经尝试了一些 gtk_thread 的东西来脱离 main,但是这显然已被弃用,所以我尽量不使用它。

输入必须由不是 gtk_main() 的线程读取,因为输入不是来自 GUI。实际上,它将是一个插入 beaglebone black 的设备,但我认为这是一个更简单的类似情况。

将使用的实际输入方法是 1) 指纹传感器,它根据通过 UART channel 发送和接收的字节执行操作,以及 2) 在运行的 BeagleBone Black 上使用 OpenCV 方法的 USB 摄像头和面部识别脚本Debian,与笔记本电脑联网以执行密集的 opencv 工作。目前我只是想让它与 FP 传感器一起使用。通过我们的接口(interface),我们可以调用 FP 传感器方法,该方法返回一个 int,并根据该 int 执行某些操作。

我需要能够根据返回的 int 更改 GTK 标签,然后在标签显示后调用另一个方法。

这是我尝试集成的代码片段:

while(key != 'x')
    {
        imshow("main_display", welcome);
        key = waitKey(1);  //poll keyboard at active screen

        //key = getkey();  //TODO: poll from TFT instead

        switch(key)
        {
            case 'i': //Identify User
                imshow("main_display", press_finger);
                waitKey(1);
                printf("\n---IDENTIFY USER---\n");
                post_log(1, 0);

                do_reg = true;
                Ret = GT_LED_On(LS);
                printf("\nPress Finger");

                //something to force console text before loop starts...?

                Timer.InitTimer();
                while(GT_IsPressFinger(LS) == 0 && ((Timer.ElapsedTime_ms() < TIMEOUT))) {}
                if(Timer.ElapsedTime_ms() >= TIMEOUT)
                {
                    printf("\nCapture TIMEOUT\n");
                    Ret = GT_LED_Off(LS);
                    post_log(6, user_id);
                    imshow("main_display", fps_timeout);
                    waitKey(1000);
                    do_reg = false;
                    break;  //??????????????????????????? GOTO???
                }
                printf("\nCapturing...Standby...\n");
                imshow("main_display", hold_finger);
                waitKey(1);
                Ret = GT_CaptureFinger(LS, 0);

基本上,我们正在尝试使用实际的 GUI 框架而不是 imshow(),并且由于 OpenCV,设备已经有了 GTK,所以坚持使用 GTK 会很好。这个控制台问题试图弄清楚如何在简单的上下文中用 gtk 窗口的标签更改替换 imshow()。

最佳答案

我想你要找的是 Glib IO Channel .如果将其绑定(bind)到标准输入文件描述符,则在用户按下回车键时会触发信号。然后你应该能够使用 cin 来获取文本。

如果您的目的是获取某种类型的密码,您可以考虑使用 using a dialog捕获用户输入。

关于c++ - C++ 中的 GTK : Changing a Label based on console input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36556773/

相关文章:

python - 在 Gtk ScrolledWindow 中滚动时我应该捕捉什么信号?

c++ - 无法在 C++ 中初始化指针数组

c++ - 如何禁用或重新路由 ALSA lib 日志记录

c++ - __cdecl 调用约定不适用于 msvc x64

java - 打印或 println 中的 IOException

java - 正则表达式读取Java中的特定文件格式

java - 如何将 HTTP 请求正文写入 Java Web 应用程序中的文件?

c - GObject函数改变窗口标题

webkit - 无需 GTK 即可运行 webkit WebView?

c++ - 需要一些手持来渲染、显示和保存图像