Python中的Tk和Ping问题

时间:2010-03-12 05:19:27

标签: python tkinter

我无法使这条线与Tk一起使用

import os
while(1):
    ping = os.popen('ping www.google.com -n 1')
    result = ping.readlines()
    msLine = result[-1].strip()
    print msLine.split(' = ')[-1]

我正在尝试创建一个标签和text = msLine.split ...但是所有内容都会冻结

2 个答案:

答案 0 :(得分:0)

Tk和popen()可能存在其他问题。第一:

您不能继续ping或从google.com上获取。

在顶部添加“导入时间”,在底部添加“time.sleep(2)” while循环。

第二

您可能需要“ping www.google.com -c 1”而不是“-n 1”。 “-c 1”要求一个 ping只。 “-n 1”ping 0.0.0.1。

答案 1 :(得分:0)

您的示例代码不显示GUI代码。在没有看到代码的情况下,无法猜测为什么GUI会冻结。虽然,你的代码非常错误,所以即使你的帖子中有GUI代码,它也可能无济于事。

您是否可能忘记在根窗口小部件上调用mainloop()方法?这可以解释冻结。如果你正在调用mainloop(),那么没有理由做while(1),因为主事件循环本身是一个无限循环。你为什么要在循环中调用ping?

您遇到的一个具体问题是您正在调用ping错误。例如,选项“-n 1”需要在主机名参数之前(即:'ping -n 1 www.google.com'而不是'ping www.google.com -n 1')。另外,-n是错误的做法。我想你想要“-c 1”

以下是如何定期ping和更新标签的工作示例:

import os
from Tkinter import *
class App:
    def __init__(self):
        self.root = Tk()
        self.create_ui()
        self.url = "www.google.com"
        self.do_ping = False
        self.root.mainloop()

    def create_ui(self):
        self.label = Label(self.root, width=32, text="Ping!")
        self.button = Button(text="Start", width=5, command=self.toggle)
        self.button.pack(side="top")
        self.label.pack(side="top", fill="both", expand=True)

    def toggle(self):
        if self.do_ping:
            self.do_ping = False
            self.button.configure(text="Start")
        else:
            self.do_ping = True
            self.button.configure(text="Stop")
            self.ping()

    def ping(self):
        if not self.do_ping:
            return
        ping = os.popen('ping -c 1 %s' % self.url)
        result = ping.readlines()
        msLine = result[-1].strip()
        data = msLine.split(' = ')[-1] 
        self.label.configure(text=data)
        # re-schedule to run in another half-second
        if self.do_ping:
            self.root.after(500, self.ping)

app=App()