В IDE Anjuta на Python напишем программу с кнопкой измеряющую температуру CPU (процессора компьютера).
Запустите IDE Anjuta, создайте новый проект.
Дайте проекту имя, например, pygtk004 и выберите папку для проекта.
В IDE Anjuta поверх главного окна в вашем проекте разместите кнопку.
Для Gtk объекта Button задайте имя обработчика сигнала "clicked". Например, on_click_btn.
Напишите функцию on_click_btn() - обработчик события clicked. Anjuta позволяет перетаскивать обработчик события в окно редактирования программы и вам нет необходимости беспокоиться о параметрах функции. Остаётся только поправить отступы.
Привожу код обработчика on_click_btn() для копирования:
def on_click_btn (self, button): f = open ('/sys/class/thermal/thermal_zone0/temp') #print (dir(button)) button.set_label('CPU температура = '+f.read(2)+'°C') f.close()
Я намеренно оставил закоментированную функцию #print (dir(button)) в программе себе на память. Я не знал как программно сменить надпись (label) на кнопке (объект button). Сначала, кликнув на кнопке, я вывел в терминал все свойства объекта button. Тогда мой обработчик выглядел проще:
def on_click_btn (self, button): print (dir(button))
Я запустил программу, кликнул на кнопке и в терминале получил список всех свойств объекта button:
['__bool__', '__class__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__gdoc__', '__ge__', '__getattribute__', '__gpointer__', '__grefcount__', '__gsignals__', '__gt__', '__gtype__', '__hash__', '__info__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_force_floating', '_init', '_ref', '_ref_sink', '_unref', '_unsupported_data_method', '_unsupported_method', 'activate', 'add', 'add_accelerator', 'add_child', 'add_device_events', 'add_events', 'add_mnemonic_label', 'add_tick_callback', 'bin', 'bind_property', 'bind_property_full', 'bind_template_callback_full', 'bind_template_child_full', 'can_activate_accel', 'chain', 'check_resize', 'child_focus', 'child_get', 'child_get_property', 'child_notify', 'child_notify_by_pspec', 'child_set', 'child_set_property', 'child_type', 'class_path', 'clicked', 'compat_control', 'compute_expand', 'connect', 'connect_after', 'connect_data', 'connect_object', 'connect_object_after', 'construct_child', 'container', 'create_pango_context', 'create_pango_layout', 'custom_finished', 'custom_tag_end', 'custom_tag_start', 'destroy', 'destroyed', 'device_is_shadowed', 'disconnect', 'disconnect_by_func', 'do_activate', 'do_add', 'do_adjust_baseline_allocation', 'do_adjust_baseline_request', 'do_adjust_size_allocation', 'do_adjust_size_request', 'do_button_press_event', 'do_button_release_event', 'do_can_activate_accel', 'do_check_resize', 'do_child_notify', 'do_child_type', 'do_clicked', 'do_composite_name', 'do_composited_changed', 'do_compute_expand', 'do_configure_event', 'do_damage_event', 'do_delete_event', 'do_destroy', 'do_destroy_event', 'do_direction_changed', 'do_dispatch_child_properties_changed', 'do_drag_begin', 'do_drag_data_delete', 'do_drag_data_get', 'do_drag_data_received', 'do_drag_drop', 'do_drag_end', 'do_drag_failed', 'do_drag_leave', 'do_drag_motion', 'do_draw', 'do_enter', 'do_enter_notify_event', 'do_event', 'do_focus', 'do_focus_in_event', 'do_focus_out_event', 'do_forall', 'do_get_accessible', 'do_get_child_property', 'do_get_path_for_child', 'do_get_preferred_height', 'do_get_preferred_height_and_baseline_for_width', 'do_get_preferred_height_for_width', 'do_get_preferred_width', 'do_get_preferred_width_for_height', 'do_get_request_mode', 'do_grab_broken_event', 'do_grab_focus', 'do_grab_notify', 'do_hide', 'do_hierarchy_changed', 'do_key_press_event', 'do_key_release_event', 'do_keynav_failed', 'do_leave', 'do_leave_notify_event', 'do_map', 'do_map_event', 'do_mnemonic_activate', 'do_motion_notify_event', 'do_move_focus', 'do_parent_set', 'do_popup_menu', 'do_pressed', 'do_property_notify_event', 'do_proximity_in_event', 'do_proximity_out_event', 'do_query_tooltip', 'do_queue_draw_region', 'do_realize', 'do_released', 'do_remove', 'do_screen_changed', 'do_scroll_event', 'do_selection_clear_event', 'do_selection_get', 'do_selection_notify_event', 'do_selection_received', 'do_selection_request_event', 'do_set_child_property', 'do_set_focus_child', 'do_set_related_action', 'do_show', 'do_show_all', 'do_show_help', 'do_size_allocate', 'do_state_changed', 'do_state_flags_changed', 'do_style_set', 'do_style_updated', 'do_touch_event', 'do_unmap', 'do_unmap_event', 'do_unrealize', 'do_visibility_notify_event', 'do_window_state_event', 'drag_begin', 'drag_begin_with_coordinates', 'drag_check_threshold', 'drag_dest_add_image_targets', 'drag_dest_add_text_targets', 'drag_dest_add_uri_targets', 'drag_dest_find_target', 'drag_dest_get_target_list', 'drag_dest_get_track_motion', 'drag_dest_set', 'drag_dest_set_proxy', 'drag_dest_set_target_list', 'drag_dest_set_track_motion', 'drag_dest_unset', 'drag_get_data', 'drag_highlight', 'drag_source_add_image_targets', 'drag_source_add_text_targets', 'drag_source_add_uri_targets', 'drag_source_get_target_list', 'drag_source_set', 'drag_source_set_icon_gicon', 'drag_source_set_icon_name', 'drag_source_set_icon_pixbuf', 'drag_source_set_icon_stock', 'drag_source_set_target_list', 'drag_source_unset', 'drag_unhighlight', 'draw', 'emit', 'emit_stop_by_name', 'ensure_style', 'enter', 'error_bell', 'event', 'find_child_property', 'find_property', 'find_style_property', 'forall', 'force_floating', 'foreach', 'freeze_child_notify', 'freeze_notify', 'g_type_instance', 'get_accessible', 'get_action_group', 'get_action_name', 'get_action_target_value', 'get_alignment', 'get_allocated_baseline', 'get_allocated_height', 'get_allocated_size', 'get_allocated_width', 'get_allocation', 'get_always_show_image', 'get_ancestor', 'get_app_paintable', 'get_border_width', 'get_can_default', 'get_can_focus', 'get_child', 'get_child_requisition', 'get_child_visible', 'get_children', 'get_clip', 'get_clipboard', 'get_composite_name', 'get_css_name', 'get_data', 'get_default_direction', 'get_default_style', 'get_device_enabled', 'get_device_events', 'get_direction', 'get_display', 'get_double_buffered', 'get_event_window', 'get_events', 'get_focus_chain', 'get_focus_child', 'get_focus_hadjustment', 'get_focus_on_click', 'get_focus_vadjustment', 'get_font_map', 'get_font_options', 'get_frame_clock', 'get_halign', 'get_has_tooltip', 'get_has_window', 'get_hexpand', 'get_hexpand_set', 'get_image', 'get_image_position', 'get_internal_child', 'get_label', 'get_mapped', 'get_margin_bottom', 'get_margin_end', 'get_margin_left', 'get_margin_right', 'get_margin_start', 'get_margin_top', 'get_modifier_mask', 'get_modifier_style', 'get_name', 'get_no_show_all', 'get_opacity', 'get_pango_context', 'get_parent', 'get_parent_window', 'get_path', 'get_path_for_child', 'get_pointer', 'get_preferred_height', 'get_preferred_height_and_baseline_for_width', 'get_preferred_height_for_width', 'get_preferred_size', 'get_preferred_width', 'get_preferred_width_for_height', 'get_properties', 'get_property', 'get_qdata', 'get_realized', 'get_receives_default', 'get_related_action', 'get_relief', 'get_request_mode', 'get_requisition', 'get_resize_mode', 'get_root_window', 'get_scale_factor', 'get_screen', 'get_sensitive', 'get_settings', 'get_size_request', 'get_state', 'get_state_flags', 'get_style', 'get_style_context', 'get_support_multidevice', 'get_template_child', 'get_tooltip_markup', 'get_tooltip_text', 'get_tooltip_window', 'get_toplevel', 'get_use_action_appearance', 'get_use_stock', 'get_use_underline', 'get_valign', 'get_valign_with_baseline', 'get_vexpand', 'get_vexpand_set', 'get_visible', 'get_visual', 'get_window', 'getv', 'grab_add', 'grab_default', 'grab_focus', 'grab_remove', 'handle_border_width', 'handler_block', 'handler_block_by_func', 'handler_disconnect', 'handler_is_connected', 'handler_unblock', 'handler_unblock_by_func', 'has_default', 'has_focus', 'has_grab', 'has_rc_style', 'has_screen', 'has_visible_focus', 'hide', 'hide_on_delete', 'in_destruction', 'init_template', 'input_shape_combine_region', 'insert_action_group', 'install_child_properties', 'install_child_property', 'install_properties', 'install_property', 'install_style_property', 'interface_find_property', 'interface_install_property', 'interface_list_properties', 'intersect', 'is_ancestor', 'is_composited', 'is_drawable', 'is_floating', 'is_focus', 'is_sensitive', 'is_toplevel', 'is_visible', 'keynav_failed', 'leave', 'list_accel_closures', 'list_action_prefixes', 'list_child_properties', 'list_mnemonic_labels', 'list_properties', 'list_style_properties', 'map', 'mnemonic_activate', 'modify_base', 'modify_bg', 'modify_cursor', 'modify_fg', 'modify_font', 'modify_style', 'modify_text', 'new', 'new_from_icon_name', 'new_from_stock', 'new_with_label', 'new_with_mnemonic', 'newv', 'notify', 'notify_by_pspec', 'override_background_color', 'override_color', 'override_cursor', 'override_font', 'override_property', 'override_symbolic_color', 'parent_instance', 'parser_finished', 'path', 'pop_composite_child', 'pressed', 'priv', 'propagate_draw', 'props', 'push_composite_child', 'qdata', 'queue_allocate', 'queue_compute_expand', 'queue_draw', 'queue_draw_area', 'queue_draw_region', 'queue_resize', 'queue_resize_no_redraw', 'realize', 'ref', 'ref_count', 'ref_sink', 'region_intersect', 'register_window', 'released', 'remove', 'remove_accelerator', 'remove_mnemonic_label', 'remove_tick_callback', 'render_icon', 'render_icon_pixbuf', 'reparent', 'replace_data', 'replace_qdata', 'reset_rc_styles', 'reset_style', 'resize_children', 'run_dispose', 'send_expose', 'send_focus_change', 'set_accel_path', 'set_accessible_role', 'set_accessible_type', 'set_action_name', 'set_action_target_value', 'set_alignment', 'set_allocation', 'set_always_show_image', 'set_app_paintable', 'set_border_width', 'set_buildable_property', 'set_can_default', 'set_can_focus', 'set_child_visible', 'set_clip', 'set_composite_name', 'set_connect_func', 'set_css_name', 'set_data', 'set_default_direction', 'set_detailed_action_name', 'set_device_enabled', 'set_device_events', 'set_direction', 'set_double_buffered', 'set_events', 'set_focus_chain', 'set_focus_child', 'set_focus_hadjustment', 'set_focus_on_click', 'set_focus_vadjustment', 'set_font_map', 'set_font_options', 'set_halign', 'set_has_tooltip', 'set_has_window', 'set_hexpand', 'set_hexpand_set', 'set_image', 'set_image_position', 'set_label', 'set_mapped', 'set_margin_bottom', 'set_margin_end', 'set_margin_left', 'set_margin_right', 'set_margin_start', 'set_margin_top', 'set_name', 'set_no_show_all', 'set_opacity', 'set_parent', 'set_parent_window', 'set_properties', 'set_property', 'set_realized', 'set_reallocate_redraws', 'set_receives_default', 'set_redraw_on_allocate', 'set_related_action', 'set_relief', 'set_resize_mode', 'set_sensitive', 'set_size_request', 'set_state', 'set_state_flags', 'set_style', 'set_support_multidevice', 'set_template', 'set_template_from_resource', 'set_tooltip_markup', 'set_tooltip_text', 'set_tooltip_window', 'set_use_action_appearance', 'set_use_stock', 'set_use_underline', 'set_valign', 'set_vexpand', 'set_vexpand_set', 'set_visible', 'set_visual', 'set_window', 'shape_combine_region', 'show', 'show_all', 'show_now', 'size_allocate', 'size_allocate_with_baseline', 'size_request', 'steal_data', 'steal_qdata', 'stop_emission', 'stop_emission_by_name', 'style_attach', 'style_get_property', 'sync_action_properties', 'thaw_child_notify', 'thaw_notify', 'translate_coordinates', 'trigger_tooltip_query', 'unmap', 'unparent', 'unrealize', 'unref', 'unregister_window', 'unset_focus_chain', 'unset_state_flags', 'watch_closure', 'weak_ref', 'widget']
Теперь мне стало всё понятно. Из файла pugtk004.ui я уже знал, что текст надписи на кнопке хранится в свойстве label. Осталось найти свойства объекта button или методы, содержащие в своём имени слово label. Их оказалось не много. Знания английского языка на троечку хватило, чтобы догадаться что метод set_label устанавливает надпись на кнопке. Таким образом, не привлекая Googleние, я написал обработчик on_click_btn.
Осталось рассказать как найти в Linux системе температуру процессора. Linux непрерывно измеряет и записывает показания температуры в файл располагающийся в виртуальной файловой системе в папке /sys/class. Далее вы наверное догадались как я поступил. Запустил в терминале команду tree:
tree /sys/class > sys.class.txt
Получил текстовый файл, объёмом 27,3 kb, не буду здесь показывать его содержимое, а в этом файле нашёл слово напоминающее температуру на английском языке. Шучу.
P.S. Рекомендуется указывать версию загружаемой Gtk библиотеки, например так
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GdkPixbuf, Gdk import os, sys
И ещё, я не собираюсь инсталлировать эту программу в Linux систему, поэтому в программе pygtk004.py поправляю путь к файлу pygtk004.ui:
UI_FILE = "pygtk004.ui"
Теперь можно запускать программу из src папки проекта и для её работоспособности нужно всего два файла pygtk004.py и pygtk004.ui. Запускаю из терминала:
dior@U18pro:~/Python/Anjuta/pygtk004/src$ ./pygtk004.py
Работает: