Как я могу сделать редактирование полосы прокрутки Tkinter живым - PullRequest
0 голосов
/ 18 января 2020

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

from tkinter import *
import time

master = Tk()
while True:
    scrollbar = Scrollbar(master)
    scrollbar.pack(side=RIGHT, fill=Y)

    listbox = Listbox(master, yscrollcommand=scrollbar.set)
    listbox.insert(END, "Another line\n")
    listbox.pack(side=LEFT, fill=BOTH)

    scrollbar.config(command=listbox.yview)

    time.sleep(1)

1 Ответ

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

Вы не должны использовать while True и sleep в любой инфраструктуре GUI (на любом языке), поскольку она может блокировать mainloop и не может получать события из системы, отправлять их виджетам и перерисовывать окно - так окно заморозить.

В каждом фреймворке есть некоторый метод для периодического запуска кода (ie. timer).

tkinter имеет root.after(milliseconds, function_name) для этого

#from tkinter import * # PEP8: `import *` is not preferred
import tkinter as tk
import time

# --- function ---

def add_line():
    listbox.insert('end', time.strftime("%H:%M:%S"))
    root.after(1000, add_line)  # run `add_line` again after 1000ms (1s)

# --- main ---

root = tk.Tk()

scrollbar = tk.Scrollbar(root)
scrollbar.pack(side='right', fill='y')

listbox = tk.Listbox(root, yscrollcommand=scrollbar.set)
listbox.pack(side='left', fill='both')

scrollbar.config(command=listbox.yview)

add_line()  # run `add_line` first time

root.mainloop()
...