Как запустить несколько функций, которые отображают информацию в графическом интерфейсе один за другим? - PullRequest
0 голосов
/ 02 ноября 2018

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

# first function which creates new labels and fills them with the relevant site pic,
# first article title, and description.
def fn1():
    label_maker(infoFrame, 0, 0, 630, 389, image=newImage1,
                background='red')
    label_maker(infoFrame, 630, 0, 655, 389, text=entry1.title,
                background='blue', font=("", 20), wraplength=600)
    label_maker(infoFrame, 0, 389, 1286, 389, text=entry1.description,
                wraplength=1250, font=("", 16),
                background='green')


# second function to create labels and fill them with relevant info
def fn2():
    label_maker(infoFrame, 0, 0, 630, 389, image=newImage2,
                background='red')
    label_maker(infoFrame, 630, 0, 655, 389, text=entry2.title,
                background='blue', font=("", 20), wraplength=600)
    label_maker(infoFrame, 0, 389, 1286, 389, text=entry2.description,
                wraplength=1250, font=("", 16),
                background='green')


# third
def fn3():
    label_maker(infoFrame, 0, 0, 630, 389, image=newImage3,
                background='red')
    label_maker(infoFrame, 630, 0, 655, 389, text=entry3.title,
                background='blue', font=("", 20), wraplength=600)
    label_maker(infoFrame, 0, 389, 1286, 389, text=entry3.description,
                wraplength=1250, font=("", 16),
                background='green')


# fourth
def fn4():
    label_maker(infoFrame, 0, 0, 630, 389, image=newImage4,
                background='red')
    label_maker(infoFrame, 630, 0, 655, 389, text=entry4.title,
                background='blue', font=("", 20), wraplength=600)
    label_maker(infoFrame, 0, 389, 1286, 389, text=entry4.description,
                wraplength=1250, font=("", 16),
                background='green')


# fifth
def fn5():
    label_maker(infoFrame, 0, 0, 630, 389, image=newImage5,
                background='red')
    label_maker(infoFrame, 630, 0, 655, 389, text=entry5.title,
                background='blue', font=("", 20), wraplength=600)
    label_maker(infoFrame, 0, 389, 1286, 389, text=entry5.description,
                wraplength=1250, font=("", 16),
                background='green')

Кроме того, вот функция label_maker для пояснения:

# define a new label maker function to construct labels within frames that 
will
#  be placed within infoFrame
def label_maker(master, x, y, w, h, *args, **kwargs):
    frame = Frame(master, width=w, height=h)
    frame.pack_propagate(0)
    frame.place(x=x, y=y)
    label = Label(frame, *args, **kwargs).pack(fill=BOTH, expand=1)
    return label

Я хочу запускать каждую из этих функций поочередно, когда одна функция выполняется в течение ~ 15 секунд, затем выполняется следующая, затем следующая и так далее, пока окно не закроется. Я пытался использовать метод after(), но, как я и использовал, функции выполнялись без отображения чего-либо, пока не была вызвана последняя функция. Как я могу зациклить их один за другим и заставить их отображать соответствующую информацию?

1 Ответ

0 голосов
/ 02 ноября 2018

Я не уверен на 100%, откуда ваши entry1 и другие значения ввода. Поэтому я просто создаю несколько словарей для использования на данный момент.

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

Я переработал ваш код, чтобы он стал чем-то вроде функции с моей стороны, и я внес некоторые изменения в ваш label_maker. Обратите внимание, что ваше заявление place() вызывает большую визуальную проблему здесь.

place() не повлияет на размер ваших фреймов, поэтому, когда вы используете только place() для своих виджетов в фрейме, фрейм всегда будет иметь нулевой размер. Это просто не собирается работать. Вам нужно как-то контролировать размер ваших кадров.

С учетом сказанного я упростил проблему, просто обновив метки.

Дайте мне знать, если у вас есть какие-либо вопросы.

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

Приведенный ниже код будет изменять метки за 15 секунд до закрытия в конце.

import tkinter as tk


def manage_time():
    global tracker
    if tracker == 1:
        lbl1.config(image=newImage2)
        lbl2.config(text=entry2['title'])
        lbl3.config(text=entry2['description'])
        tracker = 2
        root.after(15000, manage_time)
    elif tracker == 2:
        lbl1.config(image=newImage3)
        lbl2.config(text=entry3['title'])
        lbl3.config(text=entry3['description'])
        tracker = 3
        root.after(15000, manage_time)
    else:
        root.destroy()

def label_maker(master, x, y, w, h, *args, **kwargs):
    label = tk.Label(master, *args, **kwargs)
    label.pack(fill="both", expand=1)
    return label

root = tk.Tk()
tracker = 1
infoFrame = tk.Frame(root, width=500, height=500)
infoFrame.pack()
""" All the code for your images and entry fields"""
entry1 = {"title":"entry1", "description":"description for entry 1"}
entry2 = {"title":"entry2", "description":"description for entry 2"}
entry3 = {"title":"entry3", "description":"description for entry 3"}

newImage1 = tk.PhotoImage(file="./RGB/blue.gif")
newImage2 = tk.PhotoImage(file="./RGB/red.gif")
newImage3 = tk.PhotoImage(file="./RGB/green.gif")

lbl1 = label_maker(infoFrame, 0, 0, 630, 389, image=newImage1, background='red')
lbl2 = label_maker(infoFrame, 630, 0, 655, 389, text=entry1['title'], background='blue',)
lbl3 = label_maker(infoFrame, 0, 389, 1286, 389, text=entry1['description'], background='green')

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