【发布时间】:2019-02-14 18:54:25
【问题描述】:
import subprocess
import os
import time
from tkinter import *
root=Tk()
textbox=Text(root)
textbox.pack()
def redirector(inputStr):
textbox.insert(INSERT, inputStr)
def address_ping():
'''
DOCSTRING -> Ip addresses in servers.txt are
192.168.0.1 192.168.0.26
'''
while True:
with open('servers.txt', 'r') as f:
for ip in f:
result=subprocess.Popen(["ping", "-c", "7", "-n", "-W", "2", ip],stdout=f, stderr=f).wait()
if result:
print("ip address " + ip, "is inactive")
sys.stdout.write = redirector
else:
print("ip address " + ip, "is active")
sys.stdout.write = redirector
pass
address_ping()
root.mainloop()
我正在这里编写一段代码,它将向 IP 地址发送 ping 并返回结果。它在 CLI 上运行良好,但是我希望使用 Tkinter 将其“打印”到Text 小部件。我正处于将它发送到Text 小部件 GUI 的地步,但它只有在我中断程序后才会显示。我希望在 ping 循环过程中滚动输出到 GUI 文本区域。
【问题讨论】:
-
在这个网站上搜索
[tkinter] sleep,你会发现数百个与在tkinter 程序中使用sleep相关的问题和答案。短版:你不应该在 tkinter 应用程序的主线程中使用sleep。 -
嗨,布莱恩,感谢您的回复。我不知道在 Tkinter 中不包含睡眠功能。我已将其删除,但程序的行为仍然几乎相同 - 我的文本区域充满了更多 ping 条目。
-
“我在 if 和 else 之后设置 root.update()”:这仍然不是事件驱动编程。阅读Run your own code alongside Tkinter's event loop
-
@martineau:在我看来,从来没有理由。规范文档非常清楚:“当命令处于休眠状态时,应用程序不会响应事件。”
标签: python tkinter text-widget