【问题标题】:Ping a website with output to Tkinterping 一个输出到 Tkinter 的网站
【发布时间】:2016-01-11 23:36:38
【问题描述】:

我尝试 ping 一个网站并将输出实时显示到标签。问题:该命令产生一个无限循环(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()

【问题讨论】:

  • 为什么要调用 ping?您关心响应时间,还是只关心您可以连接到网站?您需要显示哪些实际信息?

标签: python tkinter ping


【解决方案1】:

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

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()

【讨论】:

  • tkinter 不是线程安全的。此代码可能有效,也可能无效。
  • 我有一个类似的应用程序,但想在同一个根窗口中将莫来石服务器 ping 到不同的输出(1 行)。
【解决方案2】:
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之后创建并打包,它会出现在窗口中的按钮下方。

要更新tk.Labeltext,您可以执行以下操作:

nom_mp4.configure(text=new_value_here)

for-loop 运行时窗口不会被更新,它会被“锁定”直到循环结束。要更新它,您可以将其放在for-loop 的末尾:

root.update_idletasks()

但窗口仍将被锁定。要解决这个问题,我相信您必须查看 threading 或类似的东西。

【讨论】:

    【解决方案3】:

    有效!我已根据您的建议更改了代码。我没有将 -c 选项放在 ping 命令上,因为我希望 ping 自己工作而不会阻塞程序。我按照 Oystein-hr 的建议在循环之外更改了包的位置,并使用配置更新了文本。我还插入了一个带有 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()
    

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 2010-11-12
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      相关资源
      最近更新 更多