PSALM - demo3.py
Not logged in
#!/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