Изменить страницу в Tkinter через фиксированное время - PullRequest
0 голосов
/ 29 января 2020

Есть ли способ автоматизировать c смену страниц в соответствии с фиксированным временем в Tkinter?
Например:
У меня есть 3 страницы (page1, page2, page3). Мне нужно:

  1. показать страницу 1 на 5 секунд
  2. показать страницу 2 на 5 секунд
  3. показать страницу 3 на 5 секунд

А потом снова страница 1 ...
Это возможно?
Спасибо в совете за помощь

Ответы [ 2 ]

1 голос
/ 29 января 2020

Все виджеты tkinter имеют метод с именем after, который можно настроить для вызова функций в будущем. Он принимает аргумент, представляющий миллисекунды, функцию для вызова и аргументы для передачи в функцию.

Предполагается, что у вас есть root окно с именем root, и предполагается, что у вас есть функция с именем show_page, которая Принимая аргумент, вы можете запланировать переключение страниц один раз для каждой страницы следующим образом:

root.after(5000, show_page, page1)
root.after(10000, show_page, page2)
root.after(15000, show_page, page3)

Если вы хотите непрерывное l oop, вы можете создать одну функцию, которая выполняет итерации по списку. itertools.cycle облегчает непрерывную итерацию по списку.

Поскольку вы не предоставили [mcve], вот полностью рабочий пример, который использует метку для имитации страницы, и использует itertools.cycle для непрерывного просмотра страниц каждые пять секунд.

import tkinter as tk
import itertools

def show_page(page):
    label.configure(text=page)

def cycle_page(pages):
    page = next(pages)
    show_page(page)
    root.after(5000, cycle_page, pages)

root = tk.Tk()
label = tk.Label(root, text="", width=20)
label.pack(padx=20, pady=20)

pages = itertools.cycle(["page1", "page2", "page3"])
cycle_page(pages)

root.mainloop()
0 голосов
/ 29 января 2020

Я подумал о решении, которое может решить НЕКОТОРЫЕ проблемы

pygame - сторонний Python модуль

pygame.time.delay может помочь Вы

приостанавливаете работу программы на некоторое время - Python Help Utility

Например, pygame.time.delay(5000) задержит на 5000 миллисекунд, что равно до 5 секунд

Итак, имея page1, page2, page3 в качестве ярлыка с тремя разными цветами, я придумал его

import tkinter as tk # Python 2: import Tkinter as tk
import pygame

def change_color(widget):
    pygame.time.delay(5000)

    if widget['bg'] == 'Red':
        widget.config(bg = 'Blue')

    elif widget['bg'] == 'Blue':
        widget.config(bg = 'Green')

    else:
        widget.config(bg = 'Red')



root = tk.Tk()

label=tk.Label(root, bg = 'Red', height = 1000, width = 1000)
label.pack()

label.bind('<Motion>', lambda event: change_color(label))

root.mainloop()

Но есть FLAW

  • Переплет выполнен с ДВИЖЕНИЕМ указателя. Если указатель не используется, цвет не изменится

Может быть, кто-то придет и полностью решит вашу проблему:)

Улучшено: Брайан Оукли

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