Python-Tkinter-after方法和cotroll用于帧速率

Python-Tkinter-after方法和cotroll用于帧速率,python,tkinter,frame-rate,Python,Tkinter,Frame Rate,是否可以将.after方法与fps一起使用,而不是定义毫秒。所以我想要一个6帧60赫兹的标签。 ->root.after6,而不是以毫秒为单位定义时间 例如: root = tk.Tk() ListofStimuli = ["\u00B6","\u0126"] labelprint = tk.Label(root,text="+", font = ('Sans','80','bold'), bg = "white") labelprint.place(relx=.5, rely=.5, an

是否可以将.after方法与fps一起使用,而不是定义毫秒。所以我想要一个6帧60赫兹的标签。 ->root.after6,而不是以毫秒为单位定义时间

例如:

root = tk.Tk()

ListofStimuli = ["\u00B6","\u0126"]

labelprint = tk.Label(root,text="+", font = ('Sans','80','bold'), bg = "white")
labelprint.place(relx=.5, rely=.5, anchor="c")


for elem in ListofStimuli:

    labelprint.config(text=elem) 
    root.after(100, lambda: var.set(0))
    root.wait_variable(var)
也就是说,你可以做任何你想尝试的数学 考虑差异布莱恩·奥克利

沿着这条思路,保持循环经过时间的列表;然后从首选UI刷新率中减去平均刷新率。迭代地在纳米级上向首选刷新率移动,以考虑定时不规则性

这将在大约1秒内达到并保持1ms的精度,这与after方法所允许的精度一样,因为输入是毫秒的整数。该方法适用于任何小于千秒的刻度大小

import time
import tkinter as tk

UI_REFRESH = 100 # your preferred refresh rate in milleseconds
UI_DELTA = 0.000001 # nanosecond scale iterative filter step size
UI_DEPTH = 10 # depth of ui_refreshes moving average

def animate():

    global last_refresh, ui_refreshes, last_refresh, ui_delta

    print("\033c") # clear terminal    
    # keep moving average of UI_REFRESH timing
    now = time.time()
    ui_refreshes.append(now - last_refresh)
    ui_refreshes = ui_refreshes[-UI_DEPTH:]
    ui_refresh = sum(ui_refreshes) / len(ui_refreshes)
    last_refresh = now

    # filter nanosecond scale timing oddities iteratively
    # both as they arise due to load and between various systems
    refresh_error = abs(UI_REFRESH_SEC-ui_refresh)
    if float('%.5f' % ui_refresh) < (UI_REFRESH_SEC):
        ui_delta += UI_DELTA
    if float('%.5f' % ui_refresh) > (UI_REFRESH_SEC):
        ui_delta -= UI_DELTA

    # do whatever your loop does
    # note this must take less time than your refresh rate!!
    print(  int(time.time()),
            ('%.6f' % ui_refresh),
            ('%.6f' % refresh_error),
            ('%.4f' % round(ui_refresh, 4)),
            int(1000*round(ui_refresh, 4)))

    # set perfect UI_REFRESH timing
    pause = int(1000 *
                min(UI_REFRESH_SEC, (
                    max(0, (
                        2 * UI_REFRESH_SEC - ui_refresh + ui_delta)))))
    master.after(pause, animate)

print("\033c") # clear terminal
UI_REFRESH_SEC = UI_REFRESH/1000
ui_refreshes = []
last_refresh = time.time()
ui_delta = 0
master = tk.Tk()
master.after(0, animate)
master.mainloop()

如果您想要每秒60帧,只需将1000毫秒1秒除以60即可。这会告诉你多少毫秒等于60帧每秒。对不起。也许我不准确。我有一个刷新率为60赫兹的屏幕。据我所知,屏幕将每16,67毫秒更新一次,并提供一张新图片。我想让我的程序显示6帧6*16,67ms的元素。所以我相信如果我不控制确切的刺激显示时间,一个元素可能会被描绘7或5帧。是否有可能调整after方法,以允许毫秒启动?after永远不能保证准确。它提供的唯一保证是在时间过去之前不会调用该函数。如果将其设置为16ms,它可以在16ms内运行,也可以是17、18、100或1000,这取决于程序和系统中发生的其他情况。也就是说,你可以做任何你想尝试适应差异的数学运算。显然我不是一个程序员。但我想做这件事最确切地说是为了一项心理学研究。有什么办法可以满足要求的规格吗?