Проверка интернет-соединения в реальном времени в python с графическим интерфейсом - PullRequest
0 голосов
/ 20 марта 2019

так что в основном я пытаюсь проверить, есть ли у компьютера доступ к Интернету до конца программы ....

Это в графическом интерфейсе, который сделан с помощью tkinter .....Я пытался создать новый поток и запустить функцию в цикле while (while 1 :), но там написано

Traceback (most recent call last):

.

.

.

RuntimeError: main thread is not in main loop

это программа

import threading
import socket
import time

def is_connected():
    try:
        socket.create_connection(("www.google.com", 80))
        print("Online",end="\n")
    except OSError:
        print("offline",end="\n")

tt3 =threading.Event()

while 1:
    t3=threading.Thread(target=is_connected)
    t3.start()
    time.sleep(1)

Этопрограмма с графическим интерфейсом

import threading
import socket
import time
import tkinter
top = tkinter.Tk()
top.title("")
l=tkinter.Label(top,text='')
l.pack()

def is_connected():
    try:
        socket.create_connection(("www.google.com", 80))
        print("Online",end="\n")
        l.config(text="Online")
    except OSError:
        l.config(text="offline")
        print("offline",end="\n")

tt3 =threading.Event()

while 1:
    t3=threading.Thread(target=is_connected)
    t3.start()
    time.sleep(1)

top.configure(background="#006666")
top.update()
top.mainloop()

любые предложения или помощь приветствуются!(кто-то в Reddit предложил мне использовать очередь, о которой я понятия не имею)

1 Ответ

0 голосов
/ 21 марта 2019

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

Лучше использовать .after():

import socket
import tkinter

top = tkinter.Tk()
top.title("Network Checker")
top.configure(background="#006666")

l=tkinter.Label(top,text='Checking ...')
l.pack()

def is_connected():
    try:
        socket.create_connection(("www.google.com", 80)) # better to set timeout as well
        state = "Online"
    except OSError:
        state = "Offline"
    l.config(text=state)
    print(state)
    top.after(1000, is_connected) # do checking again one second later

is_connected() # start the checking
top.mainloop()
...