首页 > 解决方案 > Python 初学者问题 - Tkinter、Threading 和 bs4 模块

问题描述

用 Anaconda 运行 Python 3.6.5,我还不习惯 PEP,很抱歉我的糟糕代码:P

我正在寻找一个程序来检查 HTML 代码,在线玩家在哪里,并检查是否有在线游戏大师。此代码应适用于在游戏中观看电影且在游戏中处于“afk”状态且不允许为“afk”的玩家 - 此窗口应警告他们。所以我编写了这样的代码。(忽略评论 - 我试图用 pandas 让它看起来更好,但它太多了)

我在找什么?

我使用了关键字“ADMINS”,因为他们的公会称为 ADMINS。每当 GM 出现在在线列表中时 - 弹出一个带有一些警告的窗口(GM 在线!)但是当我使用线程时,代码会一遍又一遍地运行,并且出现越来越多的窗口。是否有可能使该窗口只出现一次并在给定的时间间隔内刷新它?或者一直打开一个窗口,如果没有在线GM,则显示'-',如果有则显示'GM ONLINE'?

我是第一次使用 tkinter,现在我不确定如何制作它。如果你给我一个例子,那就太棒了。

提前致谢!!

import sys
import urllib
import bs4 as bs

from tkinter import *
from tkinter import ttk
import threading

gm = 'ADMINS'

def repeat():
    threading.Timer(10, repeat).start()
    link = 'https://www.daemu.cz/zebricky/online/'
    request = urllib.request.Request(
        link, headers={'User-Agent': 'Mozilla/5.0'})
    source = urllib.request.urlopen(request).read()
    #pocet_na_webpage = re.search('je online (.+?) ', str(source)).group(1)
    #df_table = pd.read_html(source)[0]
    soup = bs.BeautifulSoup(source, "lxml")
    table = soup.table
    #filtering = df_table.filter(items=[0,1,3,6])
    table_rows = table.find_all('tr')
    for tr in table_rows:
        td = tr.find_all('td')
        row = [i.text for i in td]
        #print(row)
    if gm in row:
        root = Tk()
        label = ttk.Label(root, text="GM je ONLINE!")

        label.pack()

        root.mainloop()

    else:
        print('-')


repeat()

# prazdny_list = []
# for i in range(0,len(row)):
#     if row == gms:
#         prazdny_list.append(True)
#     else:
#         prazdny_list.append(False)
# row['sloupec'] = prazdny_list

# print(row)

标签: pythontkinterbeautifulsoup

解决方案


我的问题是,有时代码有效,但有时无效,我真的不知道为什么。:D 即使帐户出现在在线 ppl 列表中,它也会一直给我“-”。只需将 gm 变量更改为与页面不同的内容即可。(例如:'Teriyaki' 或其他)无论如何谢谢 Nummer_42O,你真的帮了我很多。:P

编辑:我想我知道问题出在哪里。粘贴部分代码。当我检查这个过程时,我发现这只是检查最后一行。有任何想法吗?

import sys
import urllib
import bs4 as bs
from tkinter import *
from tkinter import ttk
import threading
gm =('ADMINS')
root = Tk(className='Status')
v = StringVar()
v.set('-')
style = ttk.Style()
style.configure("red.TLabel", foreground = "red")
label = ttk.Label(root, textvariable=v, style = "red.TLabel")
label.pack()
#print(v.get())


def check():
    link = 'https://www.daemu.cz/zebricky/online/'
    request = urllib.request.Request(
        link, headers={'User-Agent': 'Mozilla/5.0'})
    source = urllib.request.urlopen(request).read()
    #pocet_na_webpage = re.search('je online (.+?) ', str(source)).group(1)
    #df_table = pd.read_html(source)[0]
    soup = bs.BeautifulSoup(source, "lxml")
    table = soup.table
    #filtering = df_table.filter(items=[0,1,3,6])
    table_rows = table.find_all('tr')
    for tr in table_rows:
        td = tr.find_all('td')
        row = [i.text for i in td]
        #print(row)
        if str(gm) in str(row) and v.get() == ('-'):
            v.set('GM je ONLINE!')
            break
        elif str(gm) not in str(row) and v.get() == ('GM je ONLINE!'):
            v.set('-')
        #print(v.get())


def repeat():
    thread = threading.Timer(10, repeat)
    try:
        check()
        thread.start()
        root.update()
    except KeyboardInterrupt:
        root.destroy()
        thread.cancel()
        pass
    pass

repeat()
root.call('wm', 'attributes', '.', '-topmost', '1')
root.mainloop()

推荐阅读