The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Tk+xterm. Терминал xterm не выводит результат работы программы"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Python)
Изначальное сообщение [ Отслеживать ]

"Tk+xterm. Терминал xterm не выводит результат работы программы"  +/
Сообщение от xintrea (ok), 12-Апр-23, 09:46 
Имеется два примера на библиотеке Tkinter, в которых в Tk-рамку вставлен xterm. Когда примеры стартуют, в этом xterm показывается имя файла устройства tty, который првязан к данному xterm.


Первый пример работает правильно. Он имеет дополнительное поле ввода, в которое ручками нужно ввести тот же tty, который виден в xterm, и в этот самый xterm отправляются команды. И, само собой, команды в xterm выполняются, и в xterm виден результат их работы.

Второй пример работает неправильно. Дополнительного поля в нем нет, вместо этого значение tty запоминается в переменную. Все остальное ровно то же самое. И почему-то команды не отправляются в xterm, а результат их работы виден в консоли, в которой запущен python-скрипт.

Нужно, чтобы второй пример заработал правильно.

Отличия скриптов: https://i.ibb.co/HCSS70T/Screenshot-20230411-145913.png


Первый скрипт (работает правильно):


#!/usr/bin/python3

from tkinter import *
import os
import subprocess


def send_entry_to_terminal(*args):
    # *args needed since callback may be called from no arg (button)
    # or one arg (entry)

    command=commandEntry.get()
    tty="/dev/pts/%s" % tty_index.get()

    print('Command: '+command)
    print('tty: '+tty)

    os.system("%s <%s >%s 2> %s" % (command, tty, tty, tty))


root = Tk()

termFrame = Frame(root, height=700, width=1000)
termFrame.pack(fill=BOTH, expand=YES)
wid = termFrame.winfo_id()
print("Terminal window id: "+str(wid))

panelFrame=Frame(root)

Label(panelFrame, text="Command:").pack(side=LEFT)
commandEntry = Entry(panelFrame)
commandEntry.insert(0, "ls -l")
commandEntry.pack(side=LEFT,fill=X,expand=1)
commandEntry.bind("<Return>", send_entry_to_terminal)

buttonSend = Button(panelFrame, text="Send", command=send_entry_to_terminal)
buttonSend.pack(side=LEFT)

Label(panelFrame,text="/dev/pts/").pack(side=LEFT)
tty_index = Entry(panelFrame, width=3)
tty_index.insert(0, "1")
tty_index.pack(side=LEFT)

panelFrame.pack(fill=X, expand=1)

os.system('xterm -into %d -geometry 160x50 -sb -e "tty > /tmp/pyguitty.txt"' % wid)
fp=open('/tmp/pyguitty.txt', 'r')
ttyDevice=fp.readline();
fp.close();
print("tty info: "+ttyDevice)

os.system('xterm -into %d -geometry 160x50 -sb -e "tty; sh" &' % wid)

root.mainloop()

Второй скрипт (работает неправильно):


#!/usr/bin/python3

from tkinter import *
import os
import subprocess

ttyDevice=""


def send_entry_to_terminal(*args):
    # *args needed since callback may be called from no arg (button)
    # or one arg (entry)

    command=commandEntry.get()
    tty=ttyDevice

    print('Command: '+command)
    print('tty: '+tty)

    os.system("%s <%s >%s 2> %s" % (command, tty, tty, tty))


root = Tk()

termFrame = Frame(root, height=700, width=1000)
termFrame.pack(fill=BOTH, expand=YES)
wid = termFrame.winfo_id()
print("Terminal window id: "+str(wid))

panelFrame=Frame(root)

Label(panelFrame, text="Command:").pack(side=LEFT)
commandEntry = Entry(panelFrame)
commandEntry.insert(0, "ls -l")
commandEntry.pack(side=LEFT,fill=X,expand=1)
commandEntry.bind("<Return>", send_entry_to_terminal)

buttonSend = Button(panelFrame, text="Send", command=send_entry_to_terminal)
buttonSend.pack(side=LEFT)

panelFrame.pack(fill=X, expand=1)

os.system('xterm -into %d -geometry 160x50 -sb -e "tty > /tmp/pyguitty.txt"' % wid)
fp=open('/tmp/pyguitty.txt', 'r')
ttyDevice=fp.readline();
fp.close();
print("tty info: "+ttyDevice)

os.system('xterm -into %d -geometry 160x50 -sb -e "tty; sh" &' % wid)

root.mainloop()

Консольный вывод первого скрипта (ничего лишнего, вывод списка файлов остался в xterm):


$ ./guiterminal_correct.py
Terminal window id: 85983236
tty info: /dev/pts/42

Command: ls -l
tty: /dev/pts/42

Консольный вывод второго скрипта (виден список файлов, который должен был бы показываться в xterm):


$ ./guiterminal_incorrect.py
Terminal window id: 12163482
tty info: /dev/pts/43

Command: ls -l
tty: /dev/pts/43

итого 20
-rwxr-xr-x 1 xintrea Domain Users 1353 апр 11 14:25 guiterminal_correct.py
-rwxr-xr-x 1 xintrea Domain Users 1203 апр 11 14:25 guiterminal_incorrect.py


Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Tk+xterm. Терминал xterm не выводит результат работы программы"  +/
Сообщение от xintrea (ok), 12-Апр-23, 11:48 
Все, разобрался. Надо было стрипать ttyDevice.
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру