Имеется два примера на библиотеке 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/python3from 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/python3from 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/42Command: ls -l
tty: /dev/pts/42
Консольный вывод второго скрипта (виден список файлов, который должен был бы показываться в xterm):
$ ./guiterminal_incorrect.py
Terminal window id: 12163482
tty info: /dev/pts/43Command: 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