如何让tkinter的输出打印到GUI而不是CLI?

时间:2016-12-15 16:10:03

标签: python user-interface tkinter

我一直在研究这个代码,然后把输出输出到终端。如何在tkinter 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()

1 个答案:

答案 0 :(得分: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模块中的其他功能。