GladeVCP и PyVCP для начинающих

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение nkp »

да -как Ник сказал-без нета тяжко
пока все пакеты установишь или обновишь :o
легче комп привезти куда нибудь
DSP1
Опытный
Сообщения: 172
Зарегистрирован: 15 янв 2012, 19:37
Репутация: 2
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение DSP1 »

Ну не факт :)))
Я целый час пытался установить софт от модема , но так и не смог , гы .
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Nick »

Говрит GTK нужен новее.
Кстати, посмотри, какую версию Glade предлагает менеджер пакетов установить?
DSP1
Опытный
Сообщения: 172
Зарегистрирован: 15 янв 2012, 19:37
Репутация: 2
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение DSP1 »

Прошу извинить за вопрос не по теме , но , как вы и предупреждапи , оффлайн обновление
оказалось не по силам чайнику .Пакет GTK для установки потребовал другие свежие пакеты и т. д.
Я захожу как root . Положил все пакеты в usr/local и устанавливаю по очереди через :
./configure
make
make install
При попытке сконфигурировать для установки последние два пакета пишет такую ошибку .

checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.16... yes
checking for GLIB - version >= 2.31.2...
*** 'pkg-config --modversion glib-2.0' returned 2.32.4, but GLIB (2.24.1)
*** was found! If pkg-config was correct, then it is best
*** to remove the old version of GLib. You may also be able to fix the error
*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing
*** /etc/ld.so.conf. Make sure you have run ldconfig if that is
*** required on your system.
*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH
*** to point to the correct configuration files
no
configure: error:
*** GLIB 2.31.2 or better is required. The latest version of
*** GLIB is always available from ftp://ftp.gtk.org/. If GLIB is installed
*** but not in the same location as pkg-config add the location of the file
*** glib-2.0.pc to the environment variable PKG_CONFIG_PATH.
Как мне найти и удалить старую Glib ? По скринам nkp у меня не находятся ни
Glade , ни GTK . ни Glib . Устанавливал Ubuntu с диска примерно год назад ,
почти ничего не трогал .
psha
Опытный
Сообщения: 147
Зарегистрирован: 28 фев 2011, 11:11
Репутация: 1
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение psha »

А что мешает скачать .deb пакеты для своего дистрибутива и просто их поставить? Зачем мучаться...
root, доделай конвертацию! :)
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

люди, подскажите как pyvcp панель добавить как вкладку (tab) к главному окну axis (на манер ngcgui)?
смотрю код на питоне - после с++ бошка не выдерживает - взрывается :(

можно ли иметь больше чем одну панель ? тоесть одну во вкладке, вторую сбоку ?
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение nkp »

с glade это все можно - и проще и бысирей редактировать(имхо)
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

пробовал я его - понял что не люблю графические редакторы интерфейса :)
тем более ничего экстра не нужно - несколько кнопок с картинками (это еще надо проверить, работает ли)
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

хочу добавить возможность вставлять картинку на фон кнопки

Код: Выделить всё

	photo = """
R0lGODlhDwASAKUAAAAAAEY6J1FELltILFVLM19UOmNWM2NXQGlcO4BdJm5hRnFjOnVoRXluWZpw
G31yXoiAbpiDQ4qEc8J/EsCBEpKMeJWQfNeMEbWWI5uYjdmYEuubD/6kDO6qEP6oDe2wEf6sDf6x
Drq4sv61Du+9Ev65Dui/Fv69D9bGMP7FEP7KEObUOe3VHf7SE/7ZFf7cFtfW0/zgGPzhGP/jGP/k
GP/pGfnuIv/tG//yHOrp6O/v7vb29v///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJ
CgA/ACwAAAEADwARAAAGsMCfcGdhIBYIRWUnbMIWKxvuVmNhDrBmJiLF4Wq1mMtkyPx0hK63NhOr
SAFdBXXDAQBU2V2VckgKMjV4NwA0AC0pACcfAgYyNDQ3NzQvLYgnJSUCCy53np93IQMELQA8PKan
qQAhAQQkq6eoqhsEEBixqqoOEDAGJaapswAcA1kPDsDCdxwOD0I6AR0joBwbcU05ARogHh4cHBcB
OU1COQcJFBcTCQXk5U0iDwoNIvBBACH5BAkKAD8ALAAAAAAPABEAAAawwJ9wZ2EgFghFZSdswhYr
G+5WY2EOsGYmIsXharWYy2TI/HSErrc2E6tIAV0FdcMBAFTZXZVySAoyNXg3ADQALSkAJx8CBjI0
NDc3NC8tiCclJQILLneen3chAwQtADw8pqepACEBBCSrp6iqGwQQGLGqqg4QMAYlpqmzABwDWQ8O
wMJ3HA4PQjoBHSOgHBtxTTkBGiAeHhwcFwE5TUI5BwkUFxMJBeTlTSIPCg0i8EEAOw==
	"""

	img = PhotoImage(data=photo)
	self.hi_there = Button(frame, image=img, text="Hello", compound=LEFT)
	self.hi_there.img = img
я так понимаю все что передается в xml как параметры кнопки, передастся и в конструктор. в принципе нужно только добавить анализ наличия параметра data и создать на его базе картинку. еще не пробовал - только идея
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

есть еще вот такой классик

Код: Выделить всё

class pyvcp_image(_pyvcp_dummy):
    all_images = {}
    def __init__(self, master, pycomp, name, **kw):
        self.all_images[name] = PhotoImage(name, kw, master)
возможно все на много проще и уже сделано :)
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение nkp »

картинка и так вставляется во все - что есть контейнер... и в кнопку тоже:: или ты про что???
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

я про то, что пару-тройку кнопок легко добавлю в panel.xml руками, без WYSIWYG редакторов.
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

видимо так:

.ini:
EMBED_TAB_NAME = xxx
EMBED_TAB_COMMAND = pyvcp -c xxx xxx.xml

всем спасибо :)
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

облоооом :(
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Nick »

Алексс писал(а):пробовал я его - понял что не люблю графические редакторы интерфейса
+1! От лукавого они все :)!
Алексс писал(а):EMBED_TAB_COMMAND = pyvcp -c xxx xxx.xml
gladevcp - это не только редактор, но и свой загрузчик, обработчик и прочее, наверняка этот EMBED_TAB_COMMAND должен получать какой-то хендл на новое окно, а pyvcp его может и не выдавать...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Serg »

Nick писал(а):
Алексс писал(а):пробовал я его - понял что не люблю графические редакторы интерфейса
+1! От лукавого они все :)!
На Tcl/Tk очень много начатых и брошенных проектов визуальных редакторов интерфейсов - многие начинают писать, в процессе проникаются простотой создания оных в рукопашную и бросают. :hehehe:
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

Nick писал(а):наверняка этот EMBED_TAB_COMMAND должен получать какой-то хендл на новое окно
вот как раз этого хэндла и не хватает.

вернее emc его может дать:
EMBED_TAB_COMMAND = mplayer -wid {XID}

pyvcp не хочет взять :)
но как-то оно его получает если в конфиге PYVCP = aaa.xml написано...
надо искать в коде.
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение nkp »

Алексс писал(а):надо искать в коде.
axis парсит ини файл- и если PyVCP то подгружает модуль vcpparse:

Код: Выделить всё

    if vcp:
        rxid = root_window.winfo_id()
        os.environ['AXIS_FORWARD_EVENTS_TO'] = str(rxid)
        import vcpparse
        comp.setprefix("pyvcp")
        f = Tkinter.Frame(root_window)
        f.grid(row=0, column=4, rowspan=6, sticky="nw", padx=4, pady=4)
        vcpparse.filename = vcp
        vcpparse.create_vcp(f, comp)
    comp.ready()
создает вкладку:

Код: Выделить всё

def _dynamic_tab(name, text):
    tab = widgets.right.insert("end", name, text=text)
    tab.configure(borderwidth=1, highlightthickness=0)
    return tab
и наполняет содержимым:

Код: Выделить всё

def _dynamic_tabs(inifile):
    from subprocess import Popen
    tab_names = inifile.findall("DISPLAY", "EMBED_TAB_NAME")
    tab_cmd   = inifile.findall("DISPLAY", "EMBED_TAB_COMMAND")
    if len(tab_names) != len(tab_cmd):
        print "Invalid tab configuration"
        return
    rxid = root_window.winfo_id()
    os.environ['AXIS_FORWARD_EVENTS_TO'] = str(rxid)
    for i,t,c in zip(range(len(tab_cmd)), tab_names, tab_cmd):
        w = _dynamic_tab("user_" + str(i), t)
        f = Tkinter.Frame(w, container=1, borderwidth=0, highlightthickness=0)
        f.pack(fill="both", expand=1)
        xid = f.winfo_id()
        cmd = c.replace('{XID}', str(xid)).split()
        child = Popen(cmd)
        wait = cmd[:2] == ['halcmd', 'loadusr']
        _dynamic_childs[str(w)] = (child, cmd, wait)
и если прописать в ини :

Код: Выделить всё

EMBED_TAB_NAME=xml
EMBED_TAB_COMMAND=halcmd loadusr pyvcp  -x {XID} 1.xml 
то pyvcp получив ID основного окна должен бы отобразить виджеты во вкладке - ан нет
а вот почему??? может кто еще чего добавит по этому поводу....
vcpparse.py:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

#    This is a component of AXIS, a front-end for 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

"""
    Parses a pyVCP XML file and creates widgets by calling pyvcp_widgets.py
"""

import xml.dom.minidom
from Tkinter import *
import sys, os
import emc
import pyvcp_widgets
import hal 
import time
import traceback

# this statement is required so that stuff from Tkinter
# is not included in the pydoc documentation __All__ should list all 
# functions in this module
__all__=["read_file","nodeiterator",
        "widget_creator","paramiterator","updater","create_vcp"]
def read_file():
    """
        Reads the XML file specified by global 'filename'
        finds the <pyvcp> element and starts the parsing of the 
        file by calling nodeiterator()
    """
    try:
        doc = xml.dom.minidom.parse(filename) 
    except xml.parsers.expat.ExpatError, detail:
        print "Error: could not open",filename,"!"
	print detail
        sys.exit(1)
    # find the pydoc element
    for e in doc.childNodes:
        if e.nodeType == e.ELEMENT_NODE and e.localName == "pyvcp":
            break
    if e.localName != "pyvcp":
        print "Error: no pyvcp element in file!"
        sys.exit()
    pyvcproot=e
    nodeiterator(pyvcproot,pyvcp0) 
num=0
def nodeiterator(node,widgetparent):
    """
        A recursive function that traverses the dom tree
        and calls widget_creator() when it finds a valid element
    """
    global num
    num+=1
    params=[]
    for e in node.childNodes:
        if e.nodeType == e.ELEMENT_NODE and (e.nodeName in pyvcp_widgets.elements):  
            params = paramiterator(e)  # find all the parameters for this node
            newwidget = widget_creator(widgetparent,e.nodeName,params)
            nodeiterator(e,newwidget)
widgets=[];
def widget_creator(parent,widget_name,params):
    """
       creates a pyVCP widget
           parent = parent widget
           widget_name = name of widget to be created 
           params = a list of parameters passed to the widget __init__
    """ 
    global widgets  
    constructor = getattr(pyvcp_widgets, "pyvcp_" + str(widget_name))
    if hasattr(parent, "getcontainer"):
	container = parent.getcontainer()
    else:
	container = parent
    positional_params = (container, pycomp)
    
    try:
	widget = constructor(*positional_params, **params)
    except Exception, detail:
	raise SystemExit, "Error constructing %s(%s):\n%s" % (
			widget_name, params, detail)
    # pack the widget according to parent
    # either hbox or vbox
    if container==pyvcp0:
	widget.pack(side='top', fill=BOTH, expand=YES)
    else:
	parent.add(container, widget)  
    # add the widget to a global list widgets
    # to enable calling update() later
    widgets.append(widget)
    return widget
def paramiterator(node):
    """ returns a list of all parameters for a widget element """
    outparams = {}
    for k, v in node.attributes.items():
	if v and v[0] in "{[(\"'":
	    v = eval(v)
	else:
	    try:
		v = int(v)
	    except ValueError:
		try:
		    v = float(v)
		except ValueError:
		    pass
	outparams[str(k)] = v
    for e in node.childNodes:
	if e.nodeType == e.ELEMENT_NODE \
		and (e.nodeName not in pyvcp_widgets.elements):
            try:
                v = eval(e.childNodes[0].nodeValue)
            except: 
                exc_type, exc_value, exc_tb = sys.exc_info()
                raise SystemExit, ("Error evaluating xml file:\n"
                    "Widget %s, Property %s\n%s: %s") % (
                        node.nodeName, e.nodeName, exc_type.__name__, exc_value)
	    outparams[str(e.nodeName)] = v
    return outparams
def updater():
     """ calls pyvcp_widgets.update() on each widget repeatedly every 100 ms """
     global widgets, pycomp
     for a in widgets:
          a.update(pycomp)
     pyvcp0.after(100,updater)
def create_vcp(master, comp = None, compname="pyvcp"):
    """ 
        create a pyVCP panel 
            master = Tkinter root window or other master container
            comp = HAL component
            compname = name of HAL component which is created if comp=None
    """
    global pyvcp0, pycomp
    pyvcp0 = master
    if comp is None:
        try: 
            comp = hal.component(compname)
        except:
            print "Error: Multiple components with the same name."
            sys.exit(0)
    pycomp = comp
    read_file() 
    updater()
    return comp    
if __name__ == '__main__':
    print "You can't run vcpparse.py by itself..."
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение Алексс »

nkp писал(а):а вот почему???
pyvcp не ожидает параметра x...
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
psha
Опытный
Сообщения: 147
Зарегистрирован: 28 фев 2011, 11:11
Репутация: 1
Контактная информация:

Re: GladeVCP и PyVCP для начинающих

Сообщение psha »

вкладки делаются через xembed, ибо никакого другого способа подружить gtk и tk нету
pyvcp - это родное tk, оно грузится в axis напрямую, без xembed
соответственно pyvcp не умеет репарентиться

Если уж так нравится редактировать xml вручную - никто не мешает то же самое сделать с .ui файлом для глейда
root, доделай конвертацию! :)
Ответить

Вернуться в «LinuxCNC»