Пример программы Python Timer
Я пытаюсь сделать функцию таймера в питоне Tkinter, в которой я хочу вызвать один метод последовательно в событиях таймера.
Моя программа - простой подкласс, он не содержит root или master, так как я держал отдельный класс отдельно, поэтому я пытаюсь написать функцию after, возможно ли написать функцию after без root? Поскольку вызов tk отобразит нежелательное окно tk, я просто хочу видеть вывод события таймера только в моей оболочке Python, возможно ли это?
class App():
def __init__ (self):
self.timer_count = 0
for Test in range(4):
self.update_clock()
def update_clock(self):
self.timer_count+= 1
print self.timer_count
self.after(100, self.execute) # Is it possible?
# Can timer work without any root instance?
#
#self.root.after(100, self.update_clock)
App_Obj = App()
1 ответ
Tkinter может делать, но помните, планирование работ по-другому
Tkinter - это GUI-ориентированная среда с большим количеством встроенных функций.
(Python сам по себе позволяет создавать вещи независимо от Tkinter.)
Событие (я), основанное на таймере на стороне Tkinter, может быть установлено, однако, как сказано выше, управление таймером на стороне пользователя избегается (никакая разумная система, близкая к реальному времени, не позволит пользователю дестабилизировать, тем меньше блокировать, поток выполнения кода...)
Так. Инструменты планирования Tkinter в основном такие:
aTkScheduledEVENTid = <aTkRootWidget>.after( msecsAfter, aFun2Bcalled = None, *args )
# use
# for deterministic / set wait-time
aTkDeferredEVENTid = <aTkRootWidget>.after_idle( aFun2Bcalled = None, *args )
# use
# for non-deterministic / deferred till <SIG_IDLE> state of the GUI control-loop
<aTkRootWidget>.after_cancel( { aTkScheduledEVENTid | aTkDeferredEVENTid } )
# use
# upon a need to **cancel**/re-schedule a set execution
Волшебство соло-вызова
Запланированный вызов функции выполняется только один раз, поэтому довольно часто повторяют задачу планирования снова "внутри" вызываемой функции, чтобы заново зарегистрировать следующий вызов функции на основе таймера.
Артур разместил выше ссылку на аккуратный фрагмент кода Брайана Оукли.
Добавление трюка может помочь вам понять реальную пластичность синхронизации Tkinter под реальной нагрузкой.
(Некоторые платформы не показывают разрешение по времени в [мсек] -s)
class App(): # Bryan Oakley, in http://stackru.com/a/2401181/3666197
def __init__( self ):
self.root = tk.Tk()
self.label = tk.Label( text = "init" )
self.label.pack()
self.update_clock() # inital call to set a scheduled execution
self.root.lower() # OP.Edit: hide the Tk-window, as wanted
self.root.mainloop()
def update_clock( self ):
# \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
#
# DEMO to show real plasticity of the Tkinter scheduler timing(s)
#
print time.time() # show real activation timestamp w [msecs]
#
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
now = time.strftime( "%H:%M:%S" )
self.label.configure( text = now )
self.root.after( 1000, # re-instate next scheduled call, theoretically after given delay
self.update_clock
)
import time
time.clock() #To start timing
#Your code here
timing = time.clock() #Returns a float ex. 0.05
#this is the time from start to finish in ms