非阻止功能调用阻止Tkintker GUI启动



示例显示了我创建非阻滞状态栏的方法,同时热情地提高了我在Python中的技能。

问题是,尽管isEthernetUp()与LAN断开连接时,但不会创建GUI,也不会显示错误。令我惊讶的是,尽管使用了pythons async lib,但并未创建GUI。我该怎么办才能不时更新状态?使用异步是解决另一个问题的方法吗?在妖魔化时,我必须降低级别并使用线程吗?

我的示例:

import tkinter as tk
import socket
import asyncio
import asyncore
import datetime
import time

class Statusbar():
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Am I connected?")
        self.net_color = "red"
        self.connected = False
        self.timer = 0
        monitor = tk.Frame(self.root)
        monitor.grid(row=0, column=0)
        monitor_label = tk.Label(monitor, bd=2, relief=tk.SUNKEN,
                                 text="Net",
                                 fg="white",
                                 bg=self.net_color,
                                 padx=3,
                                 font=('courier', 16, 'bold'))
        monitor_label.grid(row=0, sticky=tk.E)
        time_label = tk.Label(self.root, text=self.timer, font=("courier", 16), relief=tk.SUNKEN)
        time_label.grid(row=0, column=1, sticky=tk.NSEW)
        self.getInfos()
        self.root.mainloop()
    def getInfos(self):
        try:
            n = NetworkIndicate()
            t = TimeIndicate()
            loop = asyncio.get_event_loop()
            loop.run_forever()
            while 1:
                self.connected = loop.run_until_complete(n.isEthernetUp())
                self.timer = loop.run_until_complete(t.whatTimeIsLove())
        except KeyboardInterrupt:
            # Canceling tasks
            asyncio.gather(*asyncio.Task.all_tasks()).cancel()
            loop.stop()
            loop.close()

class NetworkIndicate(asyncore.dispatcher):
    def __init__(self):
        pass
    @asyncio.coroutine
    async def isEthernetUp(self):
        """
        Updates the master's background color option if an IPv4 other than localhost was found and returns a boolean value.
        :return: boolean
        """
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
            s.connect(('<broadcast>', 0))
            # Referencing Example
            e = Statusbar()
            # Changes the color of the background color in Statusbar
            e.net_color = "green"
            return True
        except OSError:
            return False

class TimeIndicate(asyncore.dispatcher):
    def __init__(self):
        pass
    @asyncio.coroutine
    async def whatTimeIsLove(self):
        """
        Returns just the current unformatted time
        :return: string
        """
        return datetime.datetime.now()

if __name__ == '__main__':
    Statusbar()

我通常使用此方法使用内置的TKINTER事件循环(使用命令之后(,这将避免阻止:

import tkinter
from tkinter import *
class Visual(Frame):
    def __init__(self, root):
        self.root = root
        self.root.title("Am I connected?")
        self.net_color = "red"
        self.connected = False
        self.timer = 0
        monitor = Frame(self.root)
        monitor.grid(row=0, column=0)
        monitor_label = Label(monitor, bd=2, relief=SUNKEN,
                                 text="Net",
                                 fg="white",
                                 bg=self.net_color,
                                 padx=3,
                                 font=('courier', 16, 'bold'))
        monitor_label.grid()
        self.getInfos()
    def getInfos(self):
        print("Got the info")
        self.root.after(1000, self.getInfos)
if __name__ == '__main__':
    root = Tk()
    v = Visual(root)
    root.mainloop()

最新更新