การป้อนข้อความ GTK อัปเดตโดยทางโปรแกรม

ฉันต้องการอัปเดตการป้อนข้อความในเหตุการณ์การกดปุ่ม

สถานการณ์ของฉันไม่มีแป้นพิมพ์ ดังนั้นฉันจึงสร้างมันขึ้นมาโดยทางโปรแกรมและพยายามอัปเดตการป้อนข้อความจากตัวจัดการเหตุการณ์การกดปุ่ม

ในการกดปุ่มแต่ละครั้ง ฉันจำเป็นต้องอัปเดตรายการข้อความในหน้าต่าง GTK ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร? ฉันเหนื่อย

gtk_entry_set_text (GTK_ENTRY (entry1), buffer);

แต่มันทำให้เกิดความผิดพลาดในการแบ่งส่วน

ฉันจะได้รับข้อมูลจากเธรดผู้ใช้อื่น ฉันต้องอัปเดตการป้อนข้อความด้วยข้อมูลใหม่และแสดงหน้าต่าง gtk ด้วยการป้อนข้อความที่อัปเดต

ต่อไปนี้เป็นรหัสที่สมบูรณ์ของฉัน:

GtkEntry *entry1;

static gboolean kp_event_S1_1(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{       
    printf(" - kp_event_S1_1 - \n");
    gtk_entry_set_text (GTK_ENTRY (entry1), buffer);
}


void S1_1(void )
{   
    GtkWidget *Win_1;
    GtkBuilder *builder;        
    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "/home/glade/glade1.glade", NULL);
    window = GTK_WIDGET (gtk_builder_get_object (builder, "Win_1"));
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit),NULL );
    g_signal_connect(G_OBJECT (window), "key_press_event", G_CALLBACK (kp_event_S1_1), NULL);
    gtk_widget_show_all(window);    
    gtk_main();
}

person tux tux    schedule 29.05.2015    source แหล่งที่มา
comment
gtk_entry_set_text เป็น API ที่ถูกต้อง การรับข้อผิดพลาดในการแบ่งเซ็กเมนต์หมายความว่า entry1 ไม่ใช่อินสแตนซ์ GtkEntry * หรือ buffer ไม่ใช่สตริงที่สิ้นสุดด้วย NUL: มันง่ายมาก   -  person ntd    schedule 29.05.2015
comment
คำถามแก้ไขด้วยรหัส บัฟเฟอร์ถูกเติมจากเธรดอื่น   -  person tux tux    schedule 29.05.2015
comment
@tuxtux buffer อยู่ไหน? มีการประกาศอย่างไร? คุณยังไม่แสดงมันออกมาเลย และการอัพเดตจากกระทู้อื่นฟังดูน่ากลัวมาก ลองใช้ค่าคงที่ (ตัวอักษรสตริง) แทน buffer ในการเรียก ดูว่าได้ผลหรือไม่   -  person unwind    schedule 29.05.2015
comment
สิ่งที่คุณโพสต์ไม่แสดงปัญหา: คุณควรสร้างกรณีทดสอบที่มีในตัวน้อยที่สุด   -  person Jussi Kukkonen    schedule 29.05.2015
comment
ลองใช้สตริงตัวอย่าง ok แทนบัฟเฟอร์ (เพื่อหลีกเลี่ยงข้อสงสัยเกี่ยวกับเธรดภายนอก) แต่ผลลัพธ์ก็เหมือนกัน   -  person tux tux    schedule 29.05.2015
comment
ตัวจัดการของคุณใช้ GdkEventExpose ไม่ใช่ GdkEventKey นอกจากนี้ยังไม่แสดงว่าอะไรสร้าง GtkEntry คุณสามารถเพิ่มรหัสที่คุณแทนที่ด้วย //create window ได้หรือไม่   -  person andlabs    schedule 29.05.2015
comment
เพิ่มโค้ดสำหรับ // สร้างหน้าต่าง จริงๆ แล้วฉันกำลังสร้างหน้าต่างจากไฟล์ Glade โดยใช้ตัวเลือกตัวสร้าง   -  person tux tux    schedule 30.05.2015
comment
สวัสดีทุกคน วันนี้มีวิธีแก้ไข ฉันใช้สัญญาณผู้ใช้แบบกำหนดเอง ซึ่งทำงานได้ดี g_signal_new (สัญญาณผู้ใช้, G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); ตัวจัดการคีย์เหตุการณ์เดียวกันที่ฉันเปลี่ยนเส้นทางไปยังสัญญาณผู้ใช้   -  person tux tux    schedule 30.05.2015
comment
อย่าสร้างสัญญาณที่กำหนดเอง ปัญหาของคุณคือคุณไม่เคยกำหนด entry1 จากไฟล์ตัวสร้างของคุณ!   -  person andlabs    schedule 30.05.2015
comment
ขอบคุณ andlab ตอนนี้ jst ได้เพิ่มการมอบหมายแล้ว ซึ่งสามารถเข้าถึงได้แล้ว   -  person tux tux    schedule 30.05.2015


คำตอบ (1)


คุณไม่เคยกำหนดตัวแปร entry1 จาก GtkBuilder ของคุณ ดังนั้น entry1 ยังคงเป็น NULL ในเวลาที่มีสัญญาณ และโปรแกรมหยุดทำงาน คุณทำเพื่อ window; การทำเพื่อ entry1 ก็คล้ายกัน

person andlabs    schedule 30.05.2015