То, что вы хотите сделать, это создать пользовательский элемент управления, содержащий текстовое поле с обработчиком событий для события «GotFocus», запускающим osk.exe, и обработчик событий «Lostfocus», завершающий osk.exe, примерно так:
<UserControl [...] >
<Grid Background="White">
<TextBlock GotFocus="ShowKeyboard" LostFocus="HideKeyboard"/>
</Grid>
</UserControl>
private void ShowKeyboard(object sender, RoutedEventArgs e)
{
//run osk.exe
}
private void HideKeyboard(object sender, RoutedEventArgs e)
{
//terminate osk.exe
}
Почему есть две вложенные итерации? Для меня он производит тот же список данных только с одной итерацией:
for single_date in (start_date + timedelta(n) for n in range(day_count)):
print ...
И никакой список не сохраняется, только один генератор повторяется. Также "if" в генераторе кажется ненужным.
В конце концов, линейная последовательность должна требовать только одного итератора, а не двух.
Возможно, самым элегантным решением является с использованием функции генератора, чтобы полностью скрыть / абстрагироваться от итерации по диапазону дат:
from datetime import timedelta, date
def daterange(start_date, end_date):
for n in range(int ((end_date - start_date).days)):
yield start_date + timedelta(n)
start_date = date(2013, 1, 1)
end_date = date(2015, 6, 2)
for single_date in daterange(start_date, end_date):
print(single_date.strftime("%Y-%m-%d"))
NB: для согласованности со встроенной функцией range ()
эта итерация останавливается до достижения конечная_дата
. Поэтому для инклюзивной итерации используйте следующий день, как если бы вы использовали range ()
.
Для полноты у панд также есть функция period_range для меток времени, которые выходят за пределы:
pd.period_range(start='1/1/1626', end='1/08/1627', freq='D')
Это могло бы быть более ясно:
from datetime import date, timedelta
start_date = date(2019, 1, 1)
end_date = date(2020, 1, 1)
delta = timedelta(days=1)
while start_date <= end_date:
print (start_date.strftime("%Y-%m-%d"))
start_date += delta
import datetime
def daterange(start, stop, step=datetime.timedelta(days=1), inclusive=False):
# inclusive=False to behave like range by default
if step.days > 0:
while start < stop:
yield start
start = start + step
# not +=! don't modify object passed in if it's mutable
# since this function is not restricted to
# only types from datetime module
elif step.days < 0:
while start > stop:
yield start
start = start + step
if inclusive and start == stop:
yield start
# ...
for date in daterange(start_date, end_date, inclusive=True):
print strftime("%Y-%m-%d", date.timetuple())
Эта функция делает больше, чем вам строго требуется, путем поддержки отрицательного шага и т. Д. Пока вы учитываете логику диапазона, вам не нужен отдельный day_count
и, что наиболее важно, код становится легче читать, поскольку вы вызываете функцию из нескольких мест.
Используйте dateutil
library:
from datetime import date
from dateutil.rrule import rrule, DAILY
a = date(2009, 5, 30)
b = date(2009, 6, 9)
for dt in rrule(DAILY, dtstart=a, until=b):
print dt.strftime("%Y-%m-%d")
Эта библиотека python имеет множество дополнительных функций, некоторые из которых очень полезны, например относительная дельта
s, - и реализована в виде одного файла (модуля), который легко включается в проект. .
import datetime
def daterange(start, stop, step_days=1):
current = start
step = datetime.timedelta(step_days)
if step_days > 0:
while current < stop:
yield current
current += step
elif step_days < 0:
while current > stop:
yield current
current += step
else:
raise ValueError("daterange() step_days argument must not be zero")
if __name__ == "__main__":
from pprint import pprint as pp
lo = datetime.date(2008, 12, 27)
hi = datetime.date(2009, 1, 5)
pp(list(daterange(lo, hi)))
pp(list(daterange(hi, lo, -1)))
pp(list(daterange(lo, hi, 7)))
pp(list(daterange(hi, lo, -7)))
assert not list(daterange(lo, hi, -1))
assert not list(daterange(hi, lo))
assert not list(daterange(lo, hi, -7))
assert not list(daterange(hi, lo, 7))
for i in range(16):
print datetime.date.today() + datetime.timedelta(days=i)