Tkinter перекрывающиеся виджеты сетки - PullRequest
0 голосов
/ 14 января 2019

все. Я новичок в Python и пытаюсь освоить его, так как моя будущая работа потребует от меня его знания. Я играю с Tkinter, пытаясь заставить работать сценарий проверки связи. Результат этого сценария покажет список серверов в столбце 0 и список того, работает ли он в столбце 1. Работает ли он или нет. У меня он работает, за исключением одной вещи: виджеты перекрываются, что приводит к тому, что этот сценарий вызывает переполнение памяти. Например, если сайт «google.com» отвечает «ВВЕРХ» и я отключаю свой интернет, он будет отображаться как «ВНИЗ». Тем не менее, как только мой интернет снова подключится, он будет отображаться как «ВВЕРХ», но я вижу остатки слова «ВНИЗ» за ярлыком. Я пробовал разные способы уничтожить виджет перед каждым использованием, но не могу заставить его работать. Я понимаю, если мой код немного грязный, поэтому я определенно открыт для критики. Ниже приведен код с несколькими примерами сайтов, перечисленных в переменной host:

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)

1 Ответ

0 голосов
/ 14 января 2019

Я бы обновлял ярлыки вместо того, чтобы уничтожать их.

Мы можем использовать многопоточность для проверки каждого сайта без блокировки mainloop(). Создав список меток, вы можете использовать индекс списка, чтобы настроить метки в вашем графическом интерфейсе, и в то же время мы можем запустить поток для каждого объекта в списке, чтобы проверить состояние сайта и вернуть, если сайт работает или нет , Я решил использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...