انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: سید وحید رضا برهانی در 09 شهریور 1394، 05:30 بظ
-
من می خوام که خروجی یک فایل BASH رو توی برنامه ام نشون بدم.
من با پایتون اصلا آشنایی ندارم.
بنابه دلایلی من از tkinter برای ساخت GUI استفاده می کنم.
من از python3 استفاده می کنم.
توی جست و جو هایی که انجام دادم با Popen و Text widget باید این کار رو انجام بدم
کدی رو که نوشتم اینطوریه:
text = Text(root)
text.config(stat="normal")
p = subprocess.Popen('/script-foo.sh',stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output , err= p.communicate()
text.insert("end", output)
text.config(stat="disable")
این کد کار می کنه ولی برنامه تا زمانی که این اسکریپت فعال هست به هیچی جواب نمی ده.ومشکل دیگه اش اینکه صبر می کنه و یک دفعه ای همه ی خروجی رو چاپ می کنه حالا من یک روش بهتر می خوام که بتونه به طور زنده تر خروجی رو نشون بده.
اسکریپت ام خروجی یک برنامه را مانیتور می کنه پس خروجی خیلی زیاد هست.
-
سوال مشابه شما (http://stackoverflow.com/questions/30410421/run-process-with-realtime-output-to-a-tkinter-gui) پرسیده شده، پاسخ آخری رو تست کنید.
-
یکم ساده تر فقط دستور مورد نظر رو به جای ping جایگزین کنید.
import threading
import subprocess
from tkinter import Tk
from tkinter.scrolledtext import ScrolledText
def run_process():
cmd = "ping www.ubuntu.ir"
process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while process.poll() is None:
for line in process.stdout:
text.config(stat="normal")
text.insert("end", line)
text.see("end")
text.config(stat="disable")
root = Tk()
root.title("Ping")
text = ScrolledText(root)
text.pack(expand=True, fill="both")
thread = threading.Thread(target=run_process)
thread.setDaemon(True)
thread.start()
root.mainloop()
-
سلام
آره اینطوری خیلی بهتر شد.
من از اون روز ها اسکریپت ام رو با xterm اجرا می کردم اینطوری خروجی «زنده» می شد!
ممنون