python - Tkinter 重叠网格小部件
问题描述
每个人。我是 Python 的新手,并试图学习它,因为我未来的工作需要我知道它。我在玩 Tkinter,试图让一个 ping 脚本工作。此脚本的结果将在第 0 列中显示服务器列表,并在第 1 列中显示它是向上还是向下的列表。除了一件事外,我让它工作:小部件重叠,导致此脚本占用内存。例如,如果网站“google.com”响应“UP”并且我关闭了我的互联网,它将显示为“DOWN”。但是,一旦重新插入我的互联网,它就会显示为“UP”,但我可以看到标签后面的“DOWN”字样。我尝试了不同的方法在每次使用之前销毁小部件,但无法让它工作。我了解我的代码是否有点混乱,所以我 我绝对愿意接受批评。下面是我在“主机”变量中列出的几个示例站点的代码:
import pyping
import Tkinter as tk
from Tkinter import *
import time
host = ["google.com", "yahoo.com", "espn.com"]
root = tk.Tk()
class PingTest:
result = []
resultfc = []
def __init__(self, hostname, inc):
self.hostname = hostname
self.inc = inc
self.ping(hostname)
def results(self, result1, resultfc1):
self.result = result1
self.resultfc = resultfc1
def ping(self, y):
self.y = y
q = ""
try:
x = pyping.ping(self.y, count=1)
q = x.ret_code
except Exception:
pass
finally:
if q == 0:
self.results("UP", "green")
else:
self.results("DOWN", "red")
self.window()
def window(self):
self.label1 = Label(root, text=self.hostname)
self.label2 = Label(root, text=self.result, fg=self.resultfc, bg="black")
a = Label(root, text=self.hostname)
b = Label(root, text=self.result, fg=self.resultfc, bg="black")
b.update()
b.update_idletasks()
if b == TRUE:
b.grid_forget() # These two lines don't seem to help my cause
b.destroy()
a.grid(row=self.inc, column=0)
b.grid(row=self.inc, column=1)
while TRUE:
i = 0
for h in host:
PingTest(h, i)
i += 1
time.sleep(1)
解决方案
我会更新标签而不是销毁它们。
我们可以使用线程来检查每个站点,而不必阻止mainloop()
. 通过创建标签列表,您可以使用列表的索引在 GUI 上设置标签,同时我们可以为列表中的每个对象启动一个线程来检查站点状态并返回站点是否启动或关闭. 我选择使用urllib
并threading
完成这项工作。
import tkinter as tk
import urllib.request
import threading
import time
host = ["google.com", "yahoo.com", "espn.com"]
class CheckURL:
def __init__(self, host, widget):
self.host = host
self.widget = widget
self.update_labels()
def update_labels(self):
if urllib.request.urlopen("http://www." + self.host).getcode() == 200:
self.widget.config( text='UP', fg='green')
else:
self.widget.config(text='DOWN', fg='red')
time.sleep(5)
self.update_labels()
root = tk.Tk()
labels = []
for ndex, x in enumerate(host):
tk.Label(root, text=x).grid(row=ndex, column=0)
labels.append(tk.Label(root, text='DOWN', fg='red'))
labels[-1].grid(row=ndex, column=1)
threading._start_new_thread(CheckURL, (x, labels[-1]))
root.mainloop()
推荐阅读
- sd-card - 从 SD 卡刷新 Google Coral 板失败并出现错误:“源”命令的图像格式错误
- python - 如果一列大于另一列,则删除行
- reactjs - 从同一个外部链接连接 2 个不同的数组 - React hooks fetch
- c - About matrix operations
- python - Django + Gunicorn + Kubernetes: Website down few minutes on new deployment
- c# - after do... while loop Unhandled Exception: System.FormatException: Input string was not in a correct format
- reactjs - 将一些图像手动存储在 firebase 存储中,并在我的 react native 应用程序中使用
- php - Laravel中的积分排名,其中积分相等
- websocket - 什么时候使用 websockets 比使用消息代理(如 Kafka)更好?
- python - 比较numpy数组中的整行和列并删除选定的行和列