Ваш пример кода не показывает код 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()