У меня есть простой, работающий скрипт, который отображает 3 ping для любого IP / хоста, но проблема в том, что он работает тихо и отображает результаты только после завершения выполнения команды, вместо того, чтобы отображать каждый ping в реальном времени.
Я искал повсюду и обнаружил, что это связано с выводом буфера Python в tkinter, чего он не делает в терминале. Однако мне не удалось предотвратить эту буферизацию.
import tkinter as tk
import subprocess
def ping():
cmd = ["ping", entry.get(), "-c", "3"]
output = subprocess.check_output(cmd)
#output = subprocess.check_output("ping {} -c 3".format(entry.get()), shell=True)
print('>', output)
# put result in label
result['text'] = output.decode('utf-8')
my_gui = tk.Tk()
entry = tk.StringVar()
my_gui.geometry('300x300')
my_gui.title("Get output inside GUI")
tk.Label(my_gui, text="Enter target IP or host as required.").pack()
tk.Entry(my_gui, textvariable=entry).pack()
tk.Button(my_gui,text="Ping Test", command=ping).pack()
# label for ping result
result = tk.Label(my_gui)
result.pack()
my_gui.mainloop()
Ожидаемые результаты состоят в том, что я буду видеть каждый пинг, появляющийся в моем окне, по одной строке за раз. Фактический результат заключается в том, что окно останавливается до тех пор, пока не будут выполнены все 3 эхо-запроса, а затем отобразит результаты сразу.