LINUX.ORG.RU

Tkinter+xterm. Почему терминал xterm не выводит результат работы программы?

 , , , ,


0

1

Имеется два примера на библиотеке 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

★★★★★

Последнее исправление: Xintrea (всего исправлений: 4)

Ответ на: комментарий от peregrine

Я даже начал думать, что может быть как-то влияет задержка инициализации или включения xterm. Но инициализация делается одинаково.

И в первом и во втором случае отправка команды происходит действием пользователя по кнопке Send. Там все десять раз успевает проинициализироваться.

Вообще не понимаю в чем может быть проблема.

В скрытых символах перевода/конца строк? Так их вроде нет, иначе распечатка переменных показывала бы лишние пустые строки.

Даже не знаю, что еще проверять.

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

проблема скорее в

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

разпечатай себе что за командо отправляется в os.system. Скорее всего в переменной «tty» что-то не то лежит, например лишний пробел или \r

MKuznetsov ★★★★★
()