2

我有一个问题,每当我运行一个看似很大的功能时,tkinter Scale 小部件似乎就会卡住。

这是代码:

from tkinter import Tk, Button, Frame, Scale

root = Tk()

slider = Scale(root, orient='horizontal')
slider.pack()

frame = Frame(root)
frame.pack()

num = 0


def buttons():
    for widget in frame.winfo_children():
        widget.destroy()

    for i in range(50):
        Button(frame, text='Button' + str(i)).pack()


def basic():
    global num
    slider.set(num)
    num += 1
    print(num)
    if num <= 100:
        slider.after(100, basic)


if __name__ == '__main__':
    buttons()
    basic()

root.bind('<space>', lambda x: buttons())
root.mainloop()

我希望我的程序做的是正常更新滑块,即使我按下“空格”(意思是调用buttons()函数)
如果你每次按下空格时都仔细观察,滑块会卡住一点。
由于我将滑块用于 Mp3 播放器以显示经过的时间,因此这种时间损失非常重要,例如对于 10 秒左右的音频文件,因为滑块落后很多,看起来好像工作错误\

我还想指出,销毁按钮然后重新包装它们对我来说是必要的。
我怀疑发生这种情况是因为程序必须检查buttons()函数,因为它创建了 50 个按钮,因此需要一些时间。还是我弄错了?

我可以避免这种滞后吗?

PS:正如我在评论中提到的:

我通常有一个按钮来重命名一个(按钮),这是一首歌曲,为了让它们在重命名后按字母顺序排列,我需要调用绘制它们的函数。如果我只配置按钮的名称(而不重绘它们),它将保持原位并且不会根据其名称向下或向上移动,而在实际目录中,顺序将改变导致不适当的行为,例如播放相同歌曲

以下是一些图片以便更好地理解: 改名前改名后

提前致谢!

4

1 回答 1

3

看看这段代码:

import tkinter as tk

def config_buttons():
    # Get the `text` of the first button
    starting_value = int(buttons[0].cget("text")) + 1
    # Iterate over all of the buttons
    for i, button in enumerate(buttons, start=starting_value):
        # Change the button's `text` and `command` atributes
        button.config(text=i, command=lambda i=i:print("Clicked %i"%i))

root = tk.Tk()
buttons = []

add_button = tk.Button(root, text="+1 on all buttons", command=config_buttons)
add_button.pack()

for i in range(50):
    button = tk.Button(root, text=i, command=lambda i=i:print("Clicked %i"%i))
    button.pack()
    buttons.append(button)

root.mainloop()

add_button按下按钮时,我遍历所有按钮并更改它们的textcommand属性。由于我没有创建新按钮,因此该功能运行得非常快。

你可以在你的代码中实现类似的东西。基本上,避免创建新按钮,只更新屏幕上已有的按钮。

于 2021-05-11T13:37:09.377 回答