2016-12-15 73 views
0

我一直在處理這段代碼,並將輸出發送到終端。我如何讓輸出打印在tkinter GUI窗口中?代碼如下:如何獲得tkinter的輸出而不是CLI打印到GUI中?

import sys 
import os 
from tkinter import * 
def ping(): 
    myinptext = entry.get() 
    os.system("ping "+entry.get()+" -c 2") 
myGui = Tk() 
entry = StringVar() 
myGui.geometry('300x300') 
myGui.title("Get output inside GUI") 
mylabel = Label(myGui,text="Enter target IP or host as required.").pack() 
mybutton = Button(myGui,text ="Ping Test",command = ping).pack() 
myEntry = Entry(myGui,textvariable=entry).pack() 
myGui.mainloop() 
+0

閱讀關於[subprocess](https://docs.python.org/3/library/subprocess.html)以及如何獲得'stdout' – furas

+0

'Widget(...)。pack()'返回'無'所以你把'None'分配給'mylabel','mybutton'和'myEntry'。如果你真的需要變量'mylabel',你必須分兩步做'mylabel = Label(..)'和'mylabel.pack()'。但在你的例子中,你不需要這個變量,所以你可以不使用變量 - 'Label(...)。pack()' – furas

回答

1

使用subprocess代替os.system。有許多功能可以使用外部命令。

我用subprocess.check_output()得到執行命令的結果。命令必須如列表["ping", entry.get(), "-c", "2"]。如果您使用shell=True,命令可以是單個字符串。

import tkinter as tk 
import subprocess 

def ping(): 
    cmd = ["ping", entry.get(), "-c", "2"] 
    output = subprocess.check_output(cmd) 
    #output = subprocess.check_output("ping {} -c 2".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() 

BTW:因爲ping需要一些時間,因此tkinter將凍結的這段時間。如果您需要非凍結版本,則需要subprocessthreading模塊中的其他功能。

+0

感謝@furas,工作得很好。非常感激! –

相關問題