Проблема с Tk и Ping в Python - PullRequest
       21

Проблема с Tk и Ping в Python

0 голосов
/ 12 марта 2010

Я не могу заставить эту линию работать с 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]

Я пытаюсь создать метку и текст = msLine.split ... но все зависает

Ответы [ 2 ]

0 голосов
/ 13 марта 2010

Ваш пример кода не показывает код GUI. Невозможно догадаться, почему ваш GUI зависает, не видя код. Хотя ваш код довольно глючный, поэтому, даже если в вашем посте был код GUI, он, скорее всего, не поможет.

Возможно ли, что вы забыли вызвать метод mainloop () вашего корневого виджета? Это объяснило бы заморозку. И если вы вызываете mainloop (), то нет смысла делать while (1), поскольку сам цикл основного события представляет собой бесконечный цикл. Почему вы вызываете пинг в цикле?

Одна конкретная проблема, с которой вы столкнулись, заключается в том, что вы неправильно называете пинг. Например, параметр «-n 1» должен указываться перед аргументом имени хоста (т. Е. «Ping -n 1 www.google.com» вместо «ping www.google.com -n 1»). Кроме того, -n это неправильно. Я думаю, что вы хотите "-c 1"

Вот рабочий пример того, как вы можете периодически пинговать и обновлять метку:

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()
0 голосов
/ 12 марта 2010

Могут быть другие проблемы с Tk и popen (). Во-первых:

Вы не должны непрерывно пинговать или получать с google.com. Добавьте «время импорта» вверху и «time.sleep (2)» внизу цикл while.

Второе:

Вы, вероятно, имели в виду «ping www.google.com -c 1» вместо «-n 1». «-C 1» запрашивает один только пинг. «-N 1» пингует 0.0.0.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...