Проблемы начинающих с Python - Tkinter, Threading и модуль bs4 - PullRequest
0 голосов
/ 02 сентября 2018

Запуск Python 3.6.5 с Anaconda, я еще не привык к PEP, извините за мой дерьмовый код: P

Я ищу программу, которая проверит HTML-код, где находятся онлайн-игроки и проверит, есть ли в сети Мастера игр. Этот код должен быть предназначен для игроков, которые смотрят фильмы во время игры и имеют «афк» в игре, а bcs не должен быть «афк» - это окно должно их предупредить. Поэтому я сделал такой код (игнорируйте комментарии - я пытался сделать так, чтобы он выглядел лучше с пандами, но слишком много)

Что я ищу?

Я использовал ключевое слово «ADMINS», потому что их гильдия называется ADMINS. Всякий раз, когда 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 голосов
/ 03 сентября 2018

Моя проблема здесь в том, что иногда код работает, но иногда нет, и я действительно не знаю почему. : D Это дает мне «-» все время, даже если учетная запись появляется в списке онлайн-пользователей. Просто измените переменную gm на что-то отличное от страницы. (например: «Терияки» или что-то еще) В любом случае, спасибо 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()
0 голосов
/ 02 сентября 2018

Если я правильно понял ваш ответ, вы хотите, чтобы это маленькое окно 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...