Python初学者问题-Tkinter,线程和bs4模块

时间:2018-09-02 12:25:55

标签: python tkinter beautifulsoup

在Anaconda上运行Python 3.6.5,我还不习惯PEP,所以很抱歉我的卑鄙代码:P

我正在寻找一个程序,该程序将检查HTML代码,在线播放器在哪里,并检查是否有在线游戏大师。此代码应适用于在玩游戏时正在观看电影并且在游戏中处于“ afk”状态的玩家,并且bcs不允许将其变为“ afk”状态-此窗口应警告他们。因此,我编写了这样的代码。(忽略注释-我试图使它在大熊猫中看起来更好,但它的方式太多了)

我在找什么?

我使用了关键字“ ADMINS” bcs,其公会名为ADMINS。 每当GM出现在联机列表中时-弹出带有警告的窗口(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)

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的答案,那么您希望该Tkinter小窗口仅显示是否已更改某些内容,或者仅更改其文本,对不对? 所以对我来说,使用更少代码的方法将是第二种方法。因此,我将首先启动该窗口,然后通过label.config(text=<text>)对其进行配置。

因此,为了让您更清楚-这应该有效:

import sys
import urllib
import bs4 as bs

from tkinter import *
from tkinter import ttk
import threading

gm = 'ADMINS'

root=Tk(className='Status')
label=ttk.Label(root,text='-')
label.pack()

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 and label.cget('text')=='-':
        label.config(text='GM je ONLINE!')
    elif gm not in row and label.cget('text')=='GM je ONLINE!':
        label.config(text='-')


repeat()
root.mainloop()

答案 1 :(得分:0)

我的问题是,有时代码可以工作,但有时却不行,我也不知道为什么。 :D即使在在线PPL列表中出现一个帐户,它也始终为我提供“-”。只需将gm变量更改为与页面不同的内容即可。 (例如:“ Teriyaki”或其他)。无论如何,感谢Nummer_42O,您确实对我有很大帮助。 :P

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

return new ListView.builder(
    itemCount: snapshot?.data?.length,
    itemBuilder: (context, index) {
        return new ListTile(
          title: new Text("${snapshot.data[index]}"),
        );
    }
);