Python-Tkinter-after方法和cotroll用于帧速率
是否可以将.after方法与fps一起使用,而不是定义毫秒。所以我想要一个6帧60赫兹的标签。 ->root.after6,而不是以毫秒为单位定义时间 例如: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
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,这取决于程序和系统中发生的其他情况。也就是说,你可以做任何你想尝试适应差异的数学运算。显然我不是一个程序员。但我想做这件事最确切地说是为了一项心理学研究。有什么办法可以满足要求的规格吗?