Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Зависание инициализации окна Tkinter либо Qt5 + Paramiko [RSS Feed]

#1 Июнь 7, 2018 19:15:49

LexFall
Зарегистрирован: 2018-06-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Зависание инициализации окна Tkinter либо Qt5 + Paramiko

Добрый день.

Столкнулся с такой проблемой.
Через по SSH делаю подключение и выполняю команду “tailf test.log”

Далее читаю построчно stdout.

Команда print(line) выводит всё корректно, каждую новую появляющуюся строку в файле test.log

Но про попытке записать в виджет TEXT происходит зависание инициализации главного окна.

Если в цикле чтения выполнить stdout.close(), то инициализация проходит успешно и так же выводится первая строка в виджет Text, но, соответственно, дальше всё взрывается, так как файл закрыт.

Пробовал в цикле как сразу же line insert-ить, так и вначале line записывать в переменную, а потом вставлять переменную

Подскажите, как решить данную проблему? К примеру как возобновить чтение stdout в новой итерации, либо как тормозить цикл пока не пройдёт запись.

Появление логов идёт примерно со скоростью 1 строка в секунду, т.е. не льёт как из ведра.

Так же данную проблему воспроизвел на PyQT5. Поведение идентичное.

Так же попытался присвоить значение линии из stdout в переменную по средствам deepcopy(). Результатов нет.

Подскажите как быть?

 #python3
from tkinter import *
import paramiko
 
host = '127.0.0.1'
user = 'user'
secret = 'pass'
port = 22
def sendtext(event):
    val = entrytext.get()
    print(val)
def cancel():
    a=1
def logs():
    for line in stdout:
        print(line.encode('utf-8'))
        line1 = line.encode('utf-8')
        textlog.insert(END,line1)
 
#Вывод главного окна по центру экрана--------------------------------------------------    
def center(win):
    win.update_idletasks()
    width = win.winfo_width()
    frm_width = win.winfo_rootx() - win.winfo_x()
    win_width = width + 2 * frm_width
    height = win.winfo_height()
    titlebar_height = win.winfo_rooty() - win.winfo_y()
    win_height = height + titlebar_height + frm_width
    x = win.winfo_screenwidth() // 2 - win_width // 2
    y = win.winfo_screenheight() // 2 - win_height // 2
    win.geometry('{}x{}+{}+{}'.format(width, height, x, y))
    win.deiconify()
#--------------------------------------------------------------------------------------
#Основной блок. Инициализация окна-----------------------------------------------------
logwindow = Tk()
#logwindow.overrideredirect(True)
logwindow.geometry('1000x800')
center(logwindow)
scrollbar = Scrollbar(logwindow)
    
textlog = Text(logwindow, width=123,height=47, bg='#000000', fg='#ffffff')
textlog.grid(column=0,row=0,columnspan=2,padx=6, pady=6)
 
entrytext = Entry(logwindow,width=148,bg='#000000', fg='#ffffff')
entrytext.grid(column=0,row=1,padx=6, pady=6)
entrytext.bind('<Return>',sendtext)
 
cancelbutton = Button (logwindow, width = 10, height = 1, text = 'Отменить',command=cancel)
cancelbutton.grid(column=1,row=1,padx=6, pady=0)
 
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
client.connect(hostname=host, username=user, password=secret, port=port)
 
stdin, stdout, stderr = client.exec_command('cd /file/path/ && tailf test.log')
 
logs()
    
client.close()
    
logwindow.mainloop()

Офлайн

  • Начало
  • » GUI
  • » Зависание инициализации окна Tkinter либо Qt5 + Paramiko[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version