ping输出到Tkinter的网站

时间:2016-01-11 23:36:38

标签: python tkinter ping

我尝试ping网站并将输出实时显示给Label。问题:该命令产生无限循环(nom_mp4 = tk.Label(root,text = line),代码在nom_mp4.pack()之前停止。 有人有想法让它发挥作用吗? 这是我的代码:

from subprocess import Popen, PIPE, STDOUT
import Tkinter as tk 
from Tkinter import *

def commande():
    cmd = 'ping www.wikipedia.com'
    p = Popen(cmd.split(), stdout=PIPE, stderr=STDOUT)
    for line in iter(p.stdout.readline,''):
        nom_mp4 = tk.Label(root, text=line)
        nom_mp4.pack()

root = Tk()
root.geometry('300x190+400+400')

browsebutton2 = tk.Button(root,text='Ping',command=commande) #le bouton browse
browsebutton2.pack()

root.mainloop()

3 个答案:

答案 0 :(得分:0)

一种解决方案是使用线程。

from subprocess import Popen, PIPE, STDOUT
import Tkinter as tk
from Tkinter import Tk
from threading import Thread


def create_worker(target):
    return Thread(target=target)


def start_worker(worker):
    worker.start()


def commande():
    cmd = 'ping www.wikipedia.com'
    p = Popen(cmd.split(), stdout=PIPE, stderr=STDOUT)
    for line in iter(p.stdout.readline, ''):
        nom_mp4 = tk.Label(root, text=line)
        nom_mp4.pack()

root = Tk()
root.geometry('300x190+400+400')

worker = create_worker(commande)
tk.Button(root, text='Ping', command=lambda: start_worker(worker)).pack()

root.mainloop()

答案 1 :(得分:0)

cmd = 'ping www.wikipedia.com'

这将无限运行。您需要定义运行的次数。在测试时,也许不会ping网站。例如:

cmd = 'ping -c 10 localhost'

-c 10告诉ping运行10次。 localhost只是ping你自己的机器,当你按照预期的方式工作时用URL替换。

您还应该在tk.Label之外移动for-loop的创建。您不需要每次都创建新标签,只需更改标签的text值即可。如果您在tk.Button之后创建并打包它,它将显示在窗口中的按钮下方。

要更新text的{​​{1}},您可以执行以下操作:

tk.Label

nom_mp4.configure(text=new_value_here) 运行时窗口不会更新,并且在循环结束之前它将被“锁定”。要让它更新,您可以将其放在for-loop

的末尾
for-loop

虽然窗口仍然会被锁定。为了解决这个问题,我相信你必须研究root.update_idletasks() 或类似的东西。

答案 2 :(得分:0)

有效!我已根据您的建议更改了代码。我没有在ping命令上放置-c选项,因为我希望ping能够独立工作而不会阻塞程序。我按照Oystein-hr的建议更改了循环外部包的位置,并使用configure更新了文本。我还插入了一个以Josh Leeb-du Toit为例的线程。 多谢你们。

from subprocess import Popen, PIPE, STDOUT
import Tkinter as tk
from Tkinter import Tk
from threading import Thread


def create_worker(target):
    return Thread(target=target)


def start_worker(worker):
    worker.start()


def commande():
    cmd = 'ping localhost'
    p = Popen(cmd.split(), stdout=PIPE, stderr=STDOUT)
    for line in iter(p.stdout.readline, ''):
        result.configure(text=line)

root = Tk()
root.geometry('600x80+400+400')

worker = create_worker(commande)
tk.Button(root, text='Ping', command=lambda: start_worker(worker)).pack()

result = tk.Label(root)
result.pack()

root.mainloop()