#!/usr/bin/env python3 # # Demonstration on how to create a GTK GUI using Psalm with Python 3.10.6. # # Requires Psalm 1.0.8 or higher. # # Run as follows: # ./demo3.py # # December 20, 2022 by Peter van Eerten. #------------------------------------------------------------------------------------ import os # Define the named pipes IN = '/dev/shm/psalm.in' OUT = '/dev/shm/psalm.out' # Create the named pipes for communication os.mkfifo(IN) os.mkfifo(OUT) # Start Psalm os.system('./psalm <' + IN + ' >' + OUT + ' &') # The communication function def comm(string): with open(IN, 'w') as fin: fin.write(string + "\n") fin.close() with open(OUT) as fout: answer = fout.readline().strip() fout.close() return answer # Send definitions first comm("DEF libgtk-3.so.0 void gtk_init int int") comm("DEF libgtk-3.so.0 long gtk_window_new int") comm("DEF libgtk-3.so.0 void gtk_window_set_title int char*") comm("DEF libgtk-3.so.0 long gtk_button_new_with_label char*") comm("DEF libgtk-3.so.0 long gtk_table_new int int int") comm("DEF libgtk-3.so.0 void gtk_table_attach_defaults long long int int int int") comm("DEF libgtk-3.so.0 long gtk_entry_new void") comm("DEF libgtk-3.so.0 char* gtk_entry_get_text long") comm("DEF libgtk-3.so.0 void gtk_entry_set_text long char*") comm("DEF libgtk-3.so.0 long gtk_radio_button_new_with_label_from_widget long char*") comm("DEF libgtk-3.so.0 void gtk_main_iteration void") comm("DEF libgtk-3.so.0 void gtk_widget_show_all int") comm("DEF libgtk-3.so.0 void gtk_widget_set_size_request long int int") comm("DEF libgtk-3.so.0 void gtk_widget_grab_focus long") comm("DEF libgtk-3.so.0 void gtk_container_add long long") comm("DEF libgobject-2.0.so.0 long g_signal_connect_data int char* address void* void* int") # Build GUI comm("EXE gtk_init NULL NULL") win = comm("EXE gtk_window_new 0") comm("EXE gtk_window_set_title " + win + " \"Python Demo program with NAMED PIPES\"") comm("EXE gtk_widget_set_size_request " + win + " 450 400") table = comm("EXE gtk_table_new 50 50 1") comm("EXE gtk_container_add " + win + " " + table) button = comm("EXE gtk_button_new_with_label Exit") comm("EXE gtk_table_attach_defaults " + table + " " + button + " 41 49 45 49") entry = comm("EXE gtk_entry_new") comm("EXE gtk_table_attach_defaults " + table + " " + entry + " 1 40 45 49") text = comm("EXE gtk_entry_new") comm("EXE gtk_table_attach_defaults " + table + " " + text + " 1 49 8 12") radio1 = comm("EXE gtk_radio_button_new_with_label_from_widget NULL Yes") comm("EXE gtk_table_attach_defaults " + table + " " + radio1 + " 1 10 1 4") radio2 = comm("EXE gtk_radio_button_new_with_label_from_widget " + radio1 + " No") comm("EXE gtk_table_attach_defaults " + table + " " + radio2 + " 1 10 4 7") comm("EXE gtk_widget_show_all " + win) comm("EXE gtk_widget_grab_focus " + entry) # Connect signals comm("EXE g_signal_connect_data " + win + " delete-event callback NULL NULL 0") comm("EXE g_signal_connect_data " + button + " clicked callback NULL NULL 0") comm("EXE g_signal_connect_data " + entry + " activate callback NULL NULL 0") # Initialize event = 0 # Mainloop while event != button and event != win: comm("EXE gtk_main_iteration") event = comm("CALLBACK 1") if event == entry: tmp = comm("EXE gtk_entry_get_text " + entry) comm("EXE gtk_entry_set_text " + text + " " + tmp) # Exit Psalm comm("EXIT") # Cleanup os.remove(IN) os.remove(OUT)
Return to PSALM