Программы на Python, который проверяет соединения на основе реакции URLLIB


Основная функция пытается создать urllib связи, и если это не удается/удастся соответствующим образом изменяется. Однако, я ищу способы улучшить этот код.

Некоторые элементы я уже в курсе:

  • Использование place действительно не идеален, я в курсе
  • Импорт Urllib дважды, но если я не сделать это, как это, за исключением: не работает правильно
  • Использование глобальных

import urllib
import urllib.request as url
from tkinter import *

master = Tk()
master.geometry("280x36")
master.resizable(False, False)
master.config(bg="#4b4b4b")
master.overrideredirect(True)

master.wm_geometry("-0-40")
master.wm_attributes("-topmost", 1)

connectStatus = Label(bg="#e67e22", fg="#fff", width=29, height=1, text="Pending", font="Bahnscrift 10")
connectStatus.place(x=10,y=8)

closeButton = Button(width=2, bg="#706f6f", fg="#fff", borderwidth=0, text="x", command=master.destroy)
closeButton.place(x=253, y=8)

def displayCheck():
    colorFlash = "#38f789" if callbackAttempt == 1 else "#ff6656"
    connectStatus.config(bg=colorFlash)
    master.after(10, runRefresh)

def runRefresh():
    attemptConnect()
    master.after(2000, displayCheck)

def attemptConnect():
    global callbackAttempt

    try:
        callbackAttempt = 1
        callback = url.urlopen("https://stackoverflow.com", timeout=1)
        connectStatus.config(text="Connection Established", font="Bahnscrift 10", bg="#2ecc71")
        callback.close()

    except urllib.error.URLError:
        connectStatus.config(text="No Connection", bg="#e74c3c", font="Bahnscrift 10")
        callbackAttempt = 0

master.after(5, runRefresh)
master.mainloop()


159
5
задан 19 февраля 2018 в 11:02 Источник Поделиться
Комментарии
1 ответ

Это отличная идея, мне нравится! Однако есть несколько различных вещей, которые можно сделать по-разному, сохраняя первоначальную идею.

Синтаксис

Взгляните на Пеп-8, это универсальный стиль руководство для Python, это даст вам представление о том, как стиль вашего кода. В качестве примера: функции, методы и переменные должны быть snake_case, не mixedCase или верблюжьего. Хотя использование последних не вызовет ошибку синтаксиса, используя Пеп-8 предпочтительнее.

Старайтесь избегать импорта подстановки (импортировать содержимое целых библиотек), так как он будет загрязнять пространство имен. В точке ниже я предлагаю библиотеку, которая не является частью стандартной библиотеки, которая должна быть отделена от стандартного импорта библиотеки, по одной линии.

import tkinter as tk

import requests

функция attemptConnect

Я бы рассмотреть возможность перехода на более высокий уровень веб-запроса, решения, запросы библиотека. Он поставляется со всеми функциями, которые нам нужны, а кроме того, он предоставляет чрезвычайно удобный объект сеанса. В основном, он будет использовать TCP-соединение, что делает последующие запросы быстрее. Мы вышлем запрос Head, так что содержание не просила.

Сначала я думал, что глобальная переменная счетчик какой-то, но приглядевшись я понял, он выступает в роли логической переменной. Почему бы не сделать это один? Это изменение отразится в вашей троичной: "#38f789" if request_successful else "#ff6656".

Я взял на себя смелость начать изменять функции и имена переменных, чтобы следовать Пеп-8.

session = requests.Session()
...
def verify_url_status():
global request_successful
try:
session.head('https://stackoverflow.com/')
request_successful = True
status_label.config(text="Connection Established", bg="#2ecc71", font="Bahnscrift 10")
except requests.exceptions.ConnectionError:
status_label.config(text="No Connection", bg="#e74c3c", font="Bahnscrift 10")
request_successful = False

Классы

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

import tkinter as tk

import requests

class URLStatus:

def __init__(self):
self.session = requests.Session()
self.request_successful = None
self.master = tk.Tk()
...
self.status_label = tk.Label(bg="#e67e22", fg="#fff", width=29, height=1, text="Pending", font="Bahnscrift 10")
self.status_label.place(x=10,y=8)

def verify_url_status(self):
try:
self.session.head('https://stackoverflow.com/')
self.request_successful = True
self.status_label.config(text="Connection Established", bg="#2ecc71", font="Bahnscrift 10")
except requests.exceptions.ConnectionError:
self.status_label.config(text="No Connection", bg="#e74c3c", font="Bahnscrift 10")
self.request_successful = False

1
ответ дан 21 февраля 2018 в 09:02 Источник Поделиться