Попытка построить сетку меток, которые можно обновить из цикла - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь написать программу ping, которая читает IP-адреса из csv, а затем пингует их и затем отображает в графическом интерфейсе, независимо от того, подключены они или нет.Я застрял в том моменте, что я могу порождать графический интерфейс и создавать ярлыки, но не могу заставить ярлыки обновляться.В идеале я хотел бы, чтобы цвет bg был зеленым, если он подключен к сети, и красным, если он не подключен.

Если я использую не тот инструмент для работы, я открыт для предложений, так как я действительно новичок в этом деле.Спасибо, что нашли время, чтобы предложить любую помощь.Я чувствую, что это так близко к тому, что я хочу, но я бьюсь головой об этом гораздо дольше, чем хочу признаться.


import os
import subprocess as sp 
import time 
import csv 
import tkinter 

root = tkinter.Tk()
root.title("Branch Pinger")

with open("hosts4.csv",'r') as csv_file: 
    addresses = csv.reader(csv_file)
    for row in addresses:
        label = tkinter.Label(root, text = row[1], relief = tkinter.RIDGE, bg="white", width=10, height=3)
        label.pack()

while True:
    with open("hosts4.csv",'r') as csv_file: 
        addresses = csv.reader(csv_file)
        for row in addresses:
            log = open("{}.csv".format(row[1]) ,"a") 
            print()
            print(time.strftime('%H:%M:%S System Pinging now:',))
            status,result = sp.getstatusoutput('ping -c 2 {}'.format(row[0])) 
            if status == 0: 
                print(time.strftime(row[1] + " is UP!")) 
                log.write(time.strftime("%D %H:%M:%S System " + row[1] + " is UP!\n")) 
                log.close() 
                root.update_idletasks()
                root.update()
            else:
                print(time.strftime(row[1] + " is --DOWN!--")) 
                log.write(time.strftime("%D %H:%M:%S System " + row[1] + " is Down!\n"))  
                log.close()
                root.update_idletasks()
                root.update()

1 Ответ

0 голосов
/ 26 апреля 2019

Вы можете создать настроенный Label, который может периодически обновляться на основе результата ping, используя .after(), как показано ниже:

import csv
import sys
import subprocess as sp
import time
import tkinter as tk

class HostStatus(tk.Label):
    if sys.platform == 'win32':
        __ping_cmd = 'ping -n 1 -w 1000 {} > nul'
    else:
        __ping_cmd = 'ping -c 1 -W 1 {} > /dev/null'

    def __init__(self, host, parent=None, sleep_ms=1000):
        super().__init__(parent)
        self.config(text=host, fg='white', bg='grey', relief=tk.RIDGE, width=10, height=3)
        self.host = host
        self.sleep_ms = sleep_ms # period in miniseconds
        self.ping_cmd = self.__ping_cmd.format(host) # construct the ping command
        self.after(100, self.ping_check)

    def ping_check(self):
        status, _ = sp.getstatusoutput(self.ping_cmd)
        self.config(bg=('red' if status else 'green'))
        self.update_idletasks()
        self.log_status(status)
        self.after(self.sleep_ms, self.ping_check) # schedule next update

    def log_status(self, status):
        with open('{}.log'.format(self.host), 'a') as log:
            print('[{}] System {} is {}!'.format(time.strftime('%D %T'), self.host, 'UP' if status == 0 else 'DOWN'), file=log)

win = tk.Tk()
win.title('Branch Pinger')

with open('hosts4.csv') as csv_file:
    for row in csv.reader(csv_file):
        HostStatus(row[1], win).pack(side=tk.LEFT)

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