LINUX.ORG.RU

Примеры самых маленьких программ с интерфейсом для Linux новичку

 ,


1

3

Я хотел бы научиться программировать. И я думаю что самый быстрый способ учиться программированию, это начать разбирать маленькие программы, то есть смотреть как они устроены и учиться на их примере создавать свои. И я подумал может быть многие из вас начинали с этой мысли и вы можете помочь мне с примерами самых маленьких коротких примитивных программ с интерфейсом. Потому что обычно самоучители по программированию начинаются с простой программы «Hello World», но эта самая примитивная программа выполняется из терминала и дает новичку маленькое представление о том как устроены программы выполняющиеся из командной строки, но это не дает новичку представления о том как устроен интерфейс и как код взаимодействует с интерфейсом и какой код и что вообще используется для написания маленького самого примитивного интерфейса. Поэтому мне бы хотелось пример самой маленькой программы с интерфейсом чтобы я могу ее запустить на компьютере и понимать. То есть я хочу что-то вроде примитивного «Hello World» но чтобы с интерфейсом. Например интерфейс с кнопочкой на которую можно было бы нажать и которая бы выполняла простейшую функцию. Я просто хочу пример как создается интерфейс. Что-то вроде программы на языке С++ и интерфейсом как в gnome,То есть маленькую программу в устройстве которой быстро разобрался бы и новичок. То есть тчобы код был не больше на пример вордовской страницы хотя бы и был простой для понимания и в то же время и с простым для понимания его устройства интерфейсом. Может у вас есть какие-то полезные ссылки на эту тему.

from gi.repository import Gtk

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")

        self.button = Gtk.Button(label="Click Here")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        print("Hello World")

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

:)

fludardes ★★
()

Все правильно думаешь, только с гуетой не связывайся, изучай unix way. И гугли по западному сегменту, в рашке-говняшке только delphi way практикуют.

anonymous
()

Ох и насоветовали тебе тут бреда! Используй Qt, это в самый раз подойдет для новичков и работу в дальнейшем сможешь найти. И вообще Qt постепенно захватывает мир.

abs ★★★
()
Ответ на: комментарий от Eddy_Em

В ынтырпрайзе гуя практически и нет никакого. Ну какой такой гуй в HFT, например?!?

anonymous
()
Ответ на: комментарий от Eddy_Em

Ну тогда прошу прощения. Для себя-то понятно, что угодно можно делать. Я зарабатываю софтом именно для конечных юзеров, и тут без нормального гуя приложения не пользуются спросом.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Не позорь профессию программиста, примазываясь к ней со своими школолошными поделками. Ты тот же индус, только еще дешевле.

anonymous
()
Ответ на: комментарий от Taetricus

Да, очень сложно (:

include 'win32ax.inc'
.data
szCaption db 'Привет лена :)',0h
szText db 'Купи учебник по математике',0h
.code
start:
push MB_OK
push szCaption
push szText
push 0
call [MessageBox]
call [ExitProcess]
.end start
[\code][br]
не пинайте сильно за винду

anonymous
()

Возьми SDL и рисуй GUI на нем.

grouzen ★★
()

В общем понадобилось мне на С написать под Linux программу,
которая будет болтаться в фоне и время от времени по команде создавать окно.
Так вот вопрос,из винды я знаю,что такие програмулины сначала инициализируются,а потом делятся на две части:
цикл обработки сообщении,которая создаёт и разрушает окна,ну и вообще много чего делает, и функцию отрисовки окна.
Вот для начала скажите мне,как создавать цикл обработки сообщении на Linux'e?

torvn77 ★★★★★
()
Ответ на: комментарий от torvn77

Уточню вопрос,мне надо сделать так,чтобы программа могла закрыть окно когда я на окне нажимаю соответствующею кнопку.
Ну а потом когда дам команду,или каких условиях,например появление «магического» файла,создавала его заново.

torvn77 ★★★★★
()

Ты хочешь python + gtk. За c++ +gtkmm не советую браться т.к. сложный он. На питоне сейчас программ вагон и маленькая тележка. Но если все же решишься, то вот https://developer.gnome.org/gtkmm-tutorial/stable/

w1nner ★★★★★
()
Последнее исправление: w1nner (всего исправлений: 1)
Ответ на: комментарий от torvn77

Каждое окно обслуживай отдельным потоком (fork уж больно жрет накладные ресурсы + усложняется IPC — потоки ты можешь синхронизовать глобальными мьютексами/переменными, а для процессов нужно уже всякие очереди сообщений, shm и прочую мутотень использовать).

Запустишь поток, создашь окно (выбранным тулбоксом), окно что-то там поделает, потом пользователь его закроет и поток отвалится. Если нужно статус завершения потока знать, перед закрытием подашь сигнал основному, и тот сделает pthread_wait (или передашь результат через глобальную переменную).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Aswed

На самом деле гуйня НЕ нужна программистам и сисадминам.

на самом деле, автомобиль НЕ нужен водителям и авторемонтникам.

Все остальные пользователи в гробу видели консоль и не будут использовать/покупать твоими программы. По этому если ты пишешь софт не только для айтишников, то гуй обязателен.

Если ты хочешь, что-бы жетончики на метро покупали твои пользователи, тебе нужен турникет для входа в метро(или в электричку, если метро в твоём Мухосранске ещё не сделали).

Только турникет — настоящий транспорт, всё остальное — не нужно!

emulek
()

helloworld.h

 #ifndef GTKMM_EXAMPLE_HELLOWORLD_H
#define GTKMM_EXAMPLE_HELLOWORLD_H

#include <gtkmm/button.h>
#include <gtkmm/window.h>

class HelloWorld : public Gtk::Window
{

public:
  HelloWorld();
  virtual ~HelloWorld();

protected:
  //Обработчики сигналов:
  void on_button_clicked();

  //Используемые виджеты:
  Gtk::Button m_button;
};

#endif // GTKMM_EXAMPLE_HELLOWORLD_H
helloworld.cc
 #include "helloworld.h"
#include <iostream>

HelloWorld::HelloWorld()
: m_button("Hello World")   //  создает новую кнопку с надписью "Hello World".
{
  // Устанавливает ширину границы окна.
  set_border_width(10);

  // В момент, когда кнопка генерирует сигнал "clicked", будет вызван
  // метод on_button_clicked(), описанный ниже.
  m_button.signal_clicked().connect(sigc::mem_fun(*this,
              &HelloWorld::on_button_clicked));

  // С помощью этого вызова виджет кнопки упаковывается в виджет окна (контейнер).
  add(m_button);

  // Финальный шаг заключается в показе только что созданного виджета...
  m_button.show();
}

HelloWorld::~HelloWorld()
{
}

void HelloWorld::on_button_clicked()
{
  std::cout << "Hello World" << std::endl;
}
main.cc
 #include "helloworld.h"
#include <gtkmm/application.h>

int main (int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  HelloWorld helloworld;

  //Показывает окно и возвращает управление в момент его закрытия.
  return app->run(helloworld);
}
Только тебе это не поможет. Сначала нужно выучить сам язык. В данном случае С++

w1nner ★★★★★
()
Ответ на: комментарий от torvn77

Уточню вопрос,мне надо сделать так,чтобы программа могла закрыть окно когда я на окне нажимаю соответствующею кнопку.

уточни: Qt или GTK? И какое именно?

emulek
()
Ответ на: комментарий от w1nner

Только тебе это не поможет. Сначала нужно выучить сам язык. В данном случае С++

Программу которую я хочу писать,это «компонент» к LinuxCNC,создаваемый с помощью утилиты halcompile. Код компонента представляет из себя С файл,который этой утилитой ставится в контекст всяких заголовочных и препроцессированых файлов. В прочем можно с помощью опции получить вместо бинарника обычный код на С. Поэтому у меня первый вопрос к w1nner.ваш пример с С работать будет?

уточни: Qt или GTK? И какое именно?

На текущий момент по умолчанию LinuxCNC распространяется на LivCD для Debian Wheezy,поэтому думаю что основной тулкит GTK2

Я не очень понимаю как LinuxCNC работает,но вроде должно выглядеть так: Запускается основной процесс который либо подгружает компонент в ядро,если его скомпилировали как .ko фаил,либо если его скомпилировали как .so,спроецируется в основной процесс(??). Либо его можно скомпилировать как отдельную программу,которая запущенная из основного процесса как то встроится в общий контекст системы,и вроде как обычно это пишут на питоне.

Пример простого халкомпонента:

component time "Time on in Hours, Minutes, Seconds";

description
"""
Time

When the time.N.start bit goes true the cycle timer resets and starts
to time until time.N.start goes false. If you connect time.N.start to
halui.is-running as a cycle timer it will reset during a pause. See
the example connections below to keep the timer timing during a pause.

Time returns the hours, minutes, and seconds that time.N.start is true.

Sample pyVCP code to display the hours:minutes:seconds.

<pyvcp>
  <hbox>
  <label>
    <text>"Cycle Time"</text>
    <font>("Helvetica",14)</font>
  </label>
  <u32>
      <halpin>"time-hours"</halpin>
      <font>("Helvetica",14)</font>
      <format>"2d"</format>
  </u32>
  <label>
    <text>":"</text>
    <font>("Helvetica",14)</font>
  </label>
  <u32>
      <halpin>"time-minutes"</halpin>
      <font>("Helvetica",14)</font>
      <format>"2d"</format>
  </u32>
  <label>
    <text>":"</text>
    <font>("Helvetica",14)</font>
  </label>
  <u32>
      <halpin>"time-seconds"</halpin>
      <font>("Helvetica",14)</font>
      <format>"2d"</format>
  </u32>
  </hbox>
</pyvcp>

In your post-gui.hal file you might use the following to connect it up

 loadrt time
 loadrt not
 addf time.0 servo-thread
 addf not.0 servo-thread
 net prog-running not.0.in <= halui.program.is-idle
 net cycle-timer time.0.start <= not.0.out
 net cycle-seconds pyvcp.time-seconds <= time.0.seconds
 net cycle-minutes pyvcp.time-minutes <= time.0.minutes
 net cycle-hours pyvcp.time-hours <= time.0.hours

""";
 
author "John Thornton";

license "GPL";

// Input Pins
pin in bit start "Timer On";

// Output Pins
pin out u32 seconds "Seconds";
pin out u32 minutes "Minutes";
pin out u32 hours "Hours";

// Global Variables
variable double totalnsec;
variable int old_start;

function _;

;;

#include "rtapi_math.h"

FUNCTION(_) {
    rtapi_u32 totalseconds;
    if(start && !old_start) totalnsec = 0;

    if(start){
    totalnsec = totalnsec + period;
    totalseconds = totalnsec * 0.000000001;
    seconds = totalseconds % 60;
   minutes = (totalseconds / 60) % 60;
   hours = (totalseconds / 3600);
   }
   old_start = start;
}

torvn77 ★★★★★
()
Ответ на: комментарий от torvn77

Пример создания компонента на python подгружаемого как отдельная программа загружающего созданную как XML фаил панель:
[code=python]#!/usr/bin/env python
# This is a component of emc
# Copyright 2007 Anders Wallin <anders.wallin@helsinki.fi>
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


«„“ Python Virtual Control Panel for EMC

A virtual control panel (VCP) is used to display and control
HAL pins, which are either BIT or FLOAT valued.

Usage: pyvcp -g WxH+X+Y -c compname myfile.xml

compname is the name of the HAL component to be created.
The name of the HAL pins associated with the VCP will begin with 'compname.'

myfile.xml is an XML file which specifies the layout of the VCP.
Valid XML tags are described in the documentation for pyvcp_widgets.py

-g option allows setting of the inital size and/or position of the panel
»«»

import sys, os
BASE = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), ".."))
sys.path.insert(0, os.path.join(BASE, «lib», «python»))

import vcpparse
import hal
from Tkinter import Tk
import getopt

def usage():
«„“ prints the usage message »«»
print «Usage: pyvcp [-g WIDTHxHEIGHT+XOFFSET+YOFFSET][-c hal_component_name] myfile.xml»
print «If the component name is not specified, the basename of the xml file is used.»
print "-g options are in pixel units, XOFFSET/YOFFSET is referenced from top left of screen"
print «use -g WIDTHxHEIGHT for just setting size or -g +XOFFSET+YOFFSET for just position»

def main():
«„“ creates a HAL component.
calls vcpparse with the specified XML file.
»«»
try:
opts, args = getopt.getopt(sys.argv[1:], «c:g:»)
except getopt.GetoptError, detail:
print detail
usage()
sys.exit(1)
window_geometry = None
component_name = None
for o, a in opts:
if o == "-c":
component_name = a
if o == "-g":
window_geometry = a


try:
filename=args[0]
except:
usage()
sys.exit(1)

if component_name is None:
component_name = os.path.splitext(os.path.basename(filename))[0]

pyvcp0 = Tk()
pyvcp0.title(component_name)
if window_geometry:
pyvcp0.geometry(window_geometry)

vcpparse.filename=filename
pycomp=vcpparse.create_vcp(compname=component_name, master=pyvcp0)
pycomp.ready()

try:
try:
pyvcp0.mainloop()
except KeyboardInterrupt:
sys.exit(0)
finally:
pycomp.exit()

if __name__ == '__main__':
main()[/code]

В принципе могу задать вопрос ещё и так,как сделать нечто похожее но только на С,при этом так,чтобы программа не прекращала работу после закрытия окна и это окно можно было бы открыть комманодой поданной через переменную [code=C]pin in bit show_window «Show window»[/code]
Собственно ради этого это основной повод чтобы научится программировать графические приложения.
Второй повод это встраивание GUI окна прямо в реалтайм компонент,тут уже точно программировать можно только на С.

torvn77 ★★★★★
()

Вот хочется присоединиться к такой оживлённой дискуссии.
Вот хочется спросить, если всё так сложно - то откуда тогда программисты берутся. Не может же быть, что все они - гении, самостоятельно освоившие эту сложную науку.
Вот, например, я, кидаюсь из стороны в сторону, какой навык дальше развивать: программирования или администрирования, Windows или Linux. А ведь ещё есть web-технологии, железо, а также кроме компьютеров существует еще куча интересных вещей, которые тоже просто необходимо изучить: например радио, или музыка, или языки, или история мировых культур. Где взять на это время, силы? Быть разносторонней личностью сложно, очень сложно. Программирование - это не моё, я это точно понял, но и с администрированием пока не всё ладно, вот ошибся я однажды в оценке собственного уровня, думал, что мне уже пора переходить на следующую ступень, а оказалось рано, не дотягиваю я пока до уровня «профи» и возможно ещё долго буду не дотягивать, просто имел однажды место фактор везения. Однако ходишь кругами, порой тянет и тянет возвращаться обратно к тому что забросил и в чём разуверился, потому что частично знаешь теорию. Знаешь в общем что такое программирование, что исполняемая программа - это файл в формате PE или ELF, что файл этот состоит из секций, что в одних секциях содержится код, в других - данные, в третьих - служебные данные, что код состоит из линий, ветвлений и циклов, а ещё тебя в школе и институте учили основам алгоритмизации: как работать с массивами и строками, численные методы там всякие, лабораторные работы проводите по написанию программы для вычисления числа Пи, а вот РЕАЛЬНЫЕ программы писать тебя никто не учил. Ведь для написания реальной программы тебе нужны будут не сколько математические методы, сколько знание функций API, одна программа потребует обращения: и к функциям glibc, и к функциям gtk и функции для обращения к данным, записанным в SQL, и функции для работы со протоколами TCP и UDP. А ещё программисты говорят, что не нужно справочники по функциям API (которые только на английском) зубрить наизусть, нужно понять как что реализовывается при помощи анализа кода аналогичной программы. Вот сколько мыслей!

sunny1983 ★★★★★
()
Ответ на: комментарий от emulek

на самом деле, автомобиль НЕ нужен водителям и авторемонтникам

На самом деле емулек не нужен пользователям линукса. Если уж делаешь аллегории на предметную область, то потрудись сделать так, что бы они соответствовали предметной области.

Aswed ★★★★★
()
Ответ на: комментарий от sunny1983

всё так сложно

для начала начни читать. Полезно читать не только нормальные тексты, и говнокод, вроде твоего поста. Просто для того, что-бы понимать, как НЕ НУЖНО писать.

Ведь для написания реальной программы тебе нужны будут не сколько математические методы, сколько знание функций API

если API написано таким говнопейсателем как ты, то… Лучше изучай историю и прочее.

Вот сколько мыслей!

дай угодаю: php программист?

emulek
()
Ответ на: комментарий от sunny1983

Плохо тебя учили лабы писать. Не нравилось тебе это, вот и все.

А ещё программисты говорят, что не нужно справочники по функциям API (которые только на английском) зубрить наизусть.

Правильно говорят - гугл есть, там найдешь что тебе надо (или хотя бы направление), затем почитаешь в этом справочнике (вдруг гугл тебя обманывает или что-то не договаривает). Потом то, чем часто пользуешься сам запомнишь.

peregrine ★★★★★
()
Ответ на: комментарий от Eddy_Em

карательная эвм

Жена нормально ручками монтирует/размонтирует флешки, использует mc, знает несколько базовых команд.

Википедия через links. Фильмы через libcaca. И всюду KOI8-R.

mix_mix ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.