Вот код вашей проблемы.
My_list = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]]
n=len(My_list)
new_list=[[],[],[],[]]
for i in range(0,n-1,2):
new_list[i]=My_list[i][:3]+My_list[i+1][3:]
new_list[i+1]=My_list[i][3:]+My_list[i+1][:3]
print(new_list)
Таким образом от пути Вы сформулировали вопрос, я вывожу, что Вы хотите иметь обработчик событий, который вызывается каждый раз, когда фокус переключается между окнами. Вы хотите быть уведомленными, вместо того, чтобы иметь необходимость опросить.
я на самом деле не думаю, называя GetFocus от OnIdle, так большая часть взлома - уверенный, что это опрашивает, но это - опрос низких издержек без побочных эффектов - но если Вы действительно хотите отследить это, , Windows Hooks является, вероятно, Вашим лучшим выбором. Конкретно можно установить рычаг CBT (WH_CBT) и прислушаться к уведомлению HCBT_SETFOCUS.
Windows называет рычаг WH_CBT с этим кодом рычага, когда Windows собирается установить фокус на любое окно. В случае определенных для потока рычагов окно должно принадлежать потоку. Если возвраты функции фильтра ПРАВДА, фокус не изменяется.
Вы могли также сделать с с WH_CALLWNDPROC, сцепляются и прислушиваются к сообщению WM_SETFOCUS.
В зависимости от того, делаете ли Вы это глобальным рычагом, или локальный для приложения, можно отследить фокус через все окна в системе или только окна, принадлежавшие процессу.
Существует простой способ использовать.Net Framework 3.5: библиотека Автоматизация UI обеспечивает, фокус события изменился, который запускает каждый раз изменение фокуса в новом управлении.
:
public void SubscribeToFocusChange()
{
AutomationFocusChangedEventHandler focusHandler
= new AutomationFocusChangedEventHandler(OnFocusChanged);
Automation.AddAutomationFocusChangedEventHandler(focusHandler);
}
private void OnFocusChanged(object src, AutomationFocusChangedEventArgs e)
{
AutomationElement focusedElement = sender as AutomationElement;
//...
}
Этот API на самом деле используют рычаг окон негласно, чтобы сделать это. Однако необходимо использовать.Net Framework...
Вы могли контролировать сообщения для событие WM_ACTIVATE.
Ну, это не может быть очень корректным..., но можно получить текущий сфокусированное управление довольно легко. Таким образом, Вы могли бы рассмотреть установку таймера, который спрашивает каждую 1/2 приблизительно секунду, "Где текущий фокус?"... Затем можно наблюдать изменения. Код Delphi в качестве примера ниже; должно быть довольно легко адаптироваться, так как реальная работа находится в Windows API calls.
<snip>
function TForm1.GetCurrentHandle: integer;
var
activeWinHandle: HWND;
focusedThreadID : DWORD;
begin
//return the Windows handle of the currently focused control
Result := 0;
activeWinHandle := GetForegroundWindow;
focusedThreadID := GetWindowThreadProcessID(activeWinHandle,nil);
if AttachThreadInput(GetCurrentThreadID,focusedThreadID,true) then begin
try
Result := GetFocus;
finally
AttachThreadInput(GetCurrentThreadID, focusedThreadID, false);
end;
end; //if attached
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//give notification if the handle changed
//(this code gets fired by a timer)
CurrentHandle := GetCurrentHandle;
if CurrentHandle <> PreviousHandle then begin
Label1.Caption := 'Last focus change occurred @ ' + DateTimeToStr(Now);
end;
PreviousHandle := CurrentHandle;
end;
<snip>
http://msdn.microsoft.com/en-us/library/ms771428.aspx
Has a window focus tracker sample.
If you're programming in .net 3.5, the Automation package olorin mentions is by far the easiest, but beware of using it in a program that itself has a UI, at least if the UI is done in WPF -- the focus tracking hooks get confused by events in its own app, and quickly lock up the UI. I sent MS a bug report on it. I have not observed the same problem using a traditional Windows Forms UI. You could, of course, put the tracking code in a separate console app and use some kind of ipc to transmit the info you need.
The tempting alternative of using Interop to access the WH_CBT Windows Hook from C# won't work -- the only global hooks you can get at from C# are the mouse and keyboard.