Нужна помощь в обновлении функции tkinter каждую минуту - PullRequest
1 голос
/ 07 мая 2019

Проблема:

Я пытаюсь создать программу с использованием tkinter для отображения ежедневных бейсбольных матчей, времени начала и текущих результатов.Проблема в живых результатах, потому что я не могу найти способ интегрировать способ обновления функции (daily_games), которая содержит текущие результаты.

Я программировал только несколько месяцев, поэтому мой код мог быть повсюду ... также извините за длинный пост.

Что я пробовал до сих пор: я пыталсяиспользуя after() и tkinters update(), но я не был уверен, как его интегрировать.

Код:

# when called this method populates Start page with links, times, scores, and game status
def daily_games(self):
    streams = stream_links.today_streams()
    row = 5
    for game in streams:
        team_1 = game[1]
        team_2 = game[2]

        logos = team_logos(team_1, team_2)
        logo = logos[0]
        logo2 = logos[1]

        # assigns team one logo
        t1_logo = tk.Label(self, image=logo)
        t1_logo.image = logo
        t1_logo.grid(column=1, row=row, sticky='NSEW')

        # assigns team two logo
        t2_logo = tk.Label(self, image=logo2)
        t2_logo.image = logo2
        t2_logo.grid(column=4, row=row, sticky='NSEW')

        # links to streams
        lbl = tk.Label(self, text=team_1 + " vs " + team_2, fg="blue", cursor="hand2", font=AVG_FONT)
        lbl.grid(column=3, row=row, sticky='NSEW')
        assign_link(lbl, game[0])

        # uses mlbgame package to get gametimes, status, and scores
        game_info = matchup_info(team_1)
        game_status_lbl = tk.Label(self, text=game_info[1], font=AVG_FONT)
        game_status_lbl.grid(column=5, row=row, sticky='NSEW')
        score_lbl = tk.Label(self, text=game_info[2] + " - " + game_info[3], font=AVG_FONT, padx=10, pady=10)
        score_lbl.grid(column=6, row=row, sticky='NSEW')
        game_start_lbl = tk.Label(self, text=game_info[0], font=AVG_FONT, padx=10, pady=10)
        game_start_lbl.grid(column=0, row=row, sticky='NSEW')

        row += 2

    return row


# method works with mlb_data to find info on game matchups and returns desired data
def matchup_info(team):
    # assigning start times/ status/ scores
    game_start = mlb_data(DATE, names_dict[team])[0]
    status = mlb_data(DATE, names_dict[team])[1]
    t1_score = str(mlb_data(DATE, names_dict[team])[2])
    t2_score = str(mlb_data(DATE, names_dict[team])[3])

    return game_start, status, t1_score, t2_score


class BaseballStreamsApp(tk.Tk):
    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.iconbitmap(self, "C:\\Users\\\\PycharmProjects\\baseball_streams\\bbstreams\\mlb_logos\\MLB.ico")
        tk.Tk.wm_title(self, "MLB Streams")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand= True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        frame = StartPage(container, self)

        self.frames[StartPage] = frame

        frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        title_lbl = tk.Label(self, text="MLB Streams " + str(date.today()), font=LARGE_FONT)
        time_lbl = tk.Label(self, text="Time", font=AVG_FONT)
        game_lbl = tk.Label(self, text="Game", font=AVG_FONT)
        score_lbl = tk.Label(self, text="Score", font=AVG_FONT)
        status_lbl = tk.Label(self, text="Status", font=AVG_FONT)

        title_lbl.grid(column=2, row=0, columnspan=2, pady=10, padx=10, sticky='NSEW')
        time_lbl.grid(column=0, row=3, sticky='NSEW')
        game_lbl.grid(column=2, row=3, columnspan=2, sticky='NSEW')
        score_lbl.grid(column=6, row=3, sticky='NSEW')
        status_lbl.grid(column=5, row=3, sticky='NSEW')

        # constant mlb network stream link
        mlb_network = tk.Label(self, text="MLB Network", font=AVG_FONT, fg="red", cursor="hand2")
        mlb_network.grid(column=4, row=0, sticky='NSEW')
        mlb_network.bind("<Button-1>",
                         lambda event:webbrowser.open_new("http://.net/game-1-.html"))

        configure(self, daily_games(self), 7)


app = BaseballStreamsApp()
app.mainloop()

В настоящее время, когда я запускал функцию(daily_games), который я хочу автоматически обновлять, изначально выполняется в классе (StartPage) и в функции _init_ в этой строке

configure(self, daily_games(self), 7)

Я хотел бы иметь способ автоматическизапускать функцию (daily_games) каждую минуту или всякий раз, когда я указываю.

Проблемы:

Допустим, я могу автоматически запустить функцию, о которой я спрашиваю, будет ли программапродолжаете писать ярлыки tkinter поверх предыдущих ярлыков, заставляя мою программу загружать компьютер ненужной нагрузкой?

если да, как мне удалить предыдущие ярлыки?

Заранее спасибо!еще раз извините за длинный пост

1 Ответ

0 голосов
/ 08 мая 2019

У меня это работает, вот как это выглядит сейчас

class BaseballStreamsApp(tk.Tk):
    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.iconbitmap(self, "C:\\Users\\Davis Hurd\\PycharmProjects\\baseball_streams\\bbstreams\\mlb_logos\\MLB.ico")
        tk.Tk.wm_title(self, "MLB Streams")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand= True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        frame = StartPage(container, self)

        self.frames[StartPage] = frame

        frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        title_lbl = tk.Label(self, text="MLB Streams " + str(date.today()), font=LARGE_FONT)
        time_lbl = tk.Label(self, text="Time", font=AVG_FONT)
        game_lbl = tk.Label(self, text="Game", font=AVG_FONT)
        score_lbl = tk.Label(self, text="Score", font=AVG_FONT)
        status_lbl = tk.Label(self, text="Status", font=AVG_FONT)

        title_lbl.grid(column=2, row=0, columnspan=2, pady=10, padx=10, sticky='NSEW')
        time_lbl.grid(column=0, row=3, sticky='NSEW')
        game_lbl.grid(column=2, row=3, columnspan=2, sticky='NSEW')
        score_lbl.grid(column=6, row=3, sticky='NSEW')
        status_lbl.grid(column=5, row=3, sticky='NSEW')

        # constant mlb network stream link
        mlb_network = tk.Label(self, text="MLB Network", font=AVG_FONT, fg="red", cursor="hand2")
        mlb_network.grid(column=4, row=0, sticky='NSEW')
        mlb_network.bind("<Button-1>",
                         lambda event:webbrowser.open_new("http://bilasport.net/game/mlb-network-vs-formula-1-3366.html"))

        # populates StartPage with Game times, links, and logos
        streams = stream_links.today_streams()
        rows = 5
        for game in streams:
            team_1 = game[1]
            team_2 = game[2]

            logos = team_logos(team_1, team_2)
            logo = logos[0]
            logo2 = logos[1]

            # assigns team one logo
            t1_logo = tk.Label(self, image=logo)
            t1_logo.image = logo
            t1_logo.grid(column=1, row=rows, sticky='NSEW')

            # assigns team two logo
            t2_logo = tk.Label(self, image=logo2)
            t2_logo.image = logo2
            t2_logo.grid(column=4, row=rows, sticky='NSEW')

            # link to stream
            lbl = tk.Label(self, text=team_1 + " vs " + team_2, fg="blue", cursor="hand2", font=AVG_FONT)
            lbl.grid(column=3, row=rows, sticky='NSEW')
            assign_link(lbl, game[0])

            # game start time
            game_start = matchup_info(team_1)[0]
            game_start_lbl = tk.Label(self, text=game_start, font=AVG_FONT, padx=10, pady=10)
            game_start_lbl.grid(column=0, row=rows, sticky='NSEW')

            rows += 2

        # handles the configuration of columns and rows
        configure(self, rows, 7)

        self.daily_games()

    # populates StartPage with updating values such as game Status and Scores
    def daily_games(self):
        streams = stream_links.today_streams()
        row = 5
        for game in streams:
            team_1 = game[1]

            # uses mlbgame package to get status, and scores
            game_info = matchup_info(team_1)
            game_status_lbl = tk.Label(self, text=game_info[1], font=AVG_FONT)
            game_status_lbl.grid(column=5, row=row, sticky='NSEW')
            score_lbl = tk.Label(self, text=game_info[2] + " - " + game_info[3], font=AVG_FONT, padx=10, pady=10)
            score_lbl.grid(column=6, row=row, sticky='NSEW')

            row += 2

        self.after(120000, self.daily_games)


app = BaseballStreamsApp()
app.mainloop()

похоже, что работает ... не уверен, насколько это эффективно, хотя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...